在运行时将大图分割为小图片数组

本文介绍如何在程序运行时将一个较大的图片分割为Image数组。实现此功能最重要的就是使用Graphics的坐标变换和绘制图片的功能。也就是使用translate()和drawImage()方法。

我们设计一个ImageUtil类,如下所示:

/**
* Copyright_2006, eric zhan
* Created on 2006-6-8
*/
package com.j2medev.image;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
public class ImageUtil {
public static Image[] splitImage(Image img, int rows, int cols) {
 
 if(img == null)
 return null;
 Image[] result = new Image[rows * cols];
 int w = img.getWidth()/cols;
 int h = img.getHeight()/rows;
 
 for(int i = 0;i<result.length;i++){
 result[i] = Image.createImage(w,h);
 Graphics g = result[i].getGraphics();
 g.translate((-i%cols)*w,(-i/cols)*h);
 g.drawImage(img,0,0,Graphics.LEFT|Graphics.TOP);
 }
 return result;
}
}

静态方法splitImage(Image img,int rows,int cols)把参数img指定的Image对象分割为rows行cols列的Image数组。这里我们把数组存储为一维数组,当然您也可以存储为二维数组。根据img的高度和宽度以及目标数组的行数和列数,可以计算出每个小图片的高度和宽度,并且每个图片的高度和宽度应该是相等的。Graphics的translate(int x,int y)方法可以将graphics上下文的原点变换到(x,y),这样随后的绘画动作都是以新的原点为准了。随后我们调用drawImage()就可以把img的部分内容绘画的新的Image中。循环结束后,把Image数组返回。

下面编写一个测试的MIDlet来看看效果,代码如下:

/**
* Copyright_2006, eric zhan
* Created on 2006-6-8
*/
package com.j2medev.image;
import java.io.IOException;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
public class ImageMIDlet extends MIDlet {
protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
}
protected void pauseApp() {
 // TODO Auto-generated method stub
}
protected void startApp() throws MIDletStateChangeException {
 // TODO Auto-generated method stub
 Display display = Display.getDisplay(this);
 Image img = null;
 try {
 img = Image.createImage("/test.png");
 } catch (IOException ex) {
 Form form = new Form("error");
 form.append("error to load the img");
 display.setCurrent(form);
 return;
 }
 display.setCurrent(new ImageCanvas(img));
}
}
class ImageCanvas extends Canvas {
private Image img = null;
public ImageCanvas(Image _img) {
 this.img = _img;
}
public void paint(Graphics g) {
 int color = g.getColor();
 g.setColor(0xFFFFFF);
 g.fillRect(0, 0, getWidth(), getHeight());
 g.setColor(color);
 if (img != null) {
 // before split
 g.drawImage(img, 0, 0, Graphics.LEFT | Graphics.TOP);
 // after
 int distance = img.getHeight() + 6;
 Image[] sprites = ImageUtil.splitImage(img, 3, 4);
 if (sprites != null) {
  for (int i = 0; i < 3; i++) {
  for (int j = 0; j < 4; j++) {
   g.drawImage(sprites[4 * i + j], j
    * sprites[4 * i + j].getWidth()+2*j, distance
    + i * sprites[4 * i + j].getHeight()+2*i,
    Graphics.LEFT | Graphics.TOP);
  }
  }
 }
 }
}
}

准备一个图片test.png,即可运行。我们建议图片的高度应该和行数成正比,图片的宽度与列数成正比。为了显示出分割的效果,这里把小图片之间加了一点间距。

时间: 2024-10-25 22:43:29

在运行时将大图分割为小图片数组的相关文章

jquery实现鼠标滑过小图时显示大图的方法

 这篇文章主要介绍了jquery实现鼠标滑过小图时显示大图的方法,涉及图片及鼠标操作的技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了jquery实现鼠标滑过小图时显示大图的方法.分享给大家供大家参考.具体实现方法如下:   代码如下: <html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8" /> <

mfc-MFC自定义的ICON,添加到对话框不能正常显示,但是运行时显示正常

问题描述 MFC自定义的ICON,添加到对话框不能正常显示,但是运行时显示正常 解决方案 你设置图片的代码可能放在运行时才设置 解决方案二: http://blog.csdn.net/abidepan/article/details/7922402 解决方案三: 这个可能和vs缓存有关,不用管他 另外有可能是你在运行时动态设置的图标

ASP.NET底层架构探索之再谈.NET运行时(一)

本文将重点讲解如何为特定的硬件设备自定义ASP.NET Web移动程序,以及使用模板自定义Form和Panel等控件.通过属性重写这个特性,使ASP.NET Web移动程序可以根据移动设备的硬件功能,为特定的硬件指定其控件的属性值.例如,应用程序可能需要一个Label控件在一些设备上显示较长的文本,而在另一些设备上显示较简短的文本.这就需要我们为每个控件都提供一组属性,应用程序可以针对各个设备重写这些属性.所有的ASP.NET移动控件都具有默认的外观和布局.对于ASP.NET移动控件,你可通过设

MYSQL客户机程序4—在运行时获取连接参数

    6.5 客户机程序4-在运行时获取连接参数     现在我们有了容易修改的防止出现错误的连接代码,我们要了解一些如何做某些比使用NULL 连接参数更灵巧的事情,如在运行时允许用户指定一些值.客户机程序3由于固定连接参数方面的缺陷,要想更改那些值中的任何一个,都必须编辑源文件并重新编译.这十分不方便,特别是想使程序用于其他人时.在运行时指定连接参数的一个通用的方法是使用命令行选项.MySQL分发包中的程序接受两种形式的连接参数,如表6 - 1所示.    与标准的MySQL客户机程序一致,

编写执行你的第一个Yukon CLR(通用语言运行时)存储过程

存储过程|执行 编写执行你的第一个Yukon CLR(通用语言运行时)存储过程 作者:Suhil Srinivas 翻译:朱二 原文出处:http://www.c-sharpcorner.com/Longhorn/Yukon/First-CLR-Procedure.asp 描述这篇文章描述了种种编写和执行一个Yukon CLR 通用语言运行时存储过程的步骤.对开发混合数据类型的SQL 存储过程来说,本文也是一个起点.需求正确安装SQL Server Yukon beta1介绍Yukon 是微软公

ASP.NET HTTP运行时组成详解

asp.net|详解 简介 不管使用哪种底层平台可靠性和性能都是对所有 Web 应用程序的主要要求尽管从某种意义上讲这两个要求是相互矛盾的.例如要构建更可靠.更健壮的应用程序可能需要将 Web 服务器与具体的应用程序分离使应用程序在进程外工作.但是如果在不同于 Web 服务器进程的内存环境中工作应用程序将变慢.因此需要采取合理的措施以确保进程外代码尽可能快地运行. 在构建 Microsoft? ASP.NET 运行时环境时依据的设计原则即充分考虑可靠性和性能.得到的 ASP.NET 进程模型包含

在运行时使用 UDDI (微软)

微软 在运行时使用 UDDI Karsten JanuszewskiMicrosoft Corporation 2001 年 12 月 摘要:本文概述了在运行时使用 UDDI,讨论了 UDDI(公共注册表和 UDDI 服务在 Microsoft Windows .NET Server 中提供)如何用作 Web 服务的基础结构以支持客户端应用程序. 目录 简介 UDDI 运行时基础结构 示例方案 创建 Web 服务:C# .NET .asmx 使用 Web 服务:C# Windows 窗体 .NE

ASP.NET HTTP运行时组成的详解

asp.net|详解 简介 不管使用哪种底层平台,可靠性和性能都是对所有 Web 应用程序的主要要求,尽管从某种意义上讲,这两个要求是相互矛盾的.例如,要构建更可靠.更健壮的应用程序,可能需要将 Web 服务器与具体的应用程序分离,使应用程序在进程外工作.但是,如果在不同于 Web 服务器进程的内存环境中工作,应用程序将变慢.因此,需要采取合理的措施,以确保进程外代码尽可能快地运行. 在构建 Microsoft? ASP.NET 运行时环境时,依据的设计原则即:充分考虑可靠性和性能.得到的 AS

C++:RTTI(RunTime Type Information)运行时类型信息 详解

RTTI, RunTime Type Information, 运行时类型信息, 是多态的主要组成部分, 通过运行时(runtime)确定使用的类型, 执行不同的函数,复用(reuse)接口. dynamic_cast<>可以 使基类指针转换为派生类的指针, 通过判断指针的类型, 可以决定使用的函数. typeid(), 可以判断类型信息, 判断指针指向位置, 在多态中, 可以判断基类还是派生类. 代码: /* * test.cpp * * Created on: 2014.04.22 * A