首页 arrow 开发技术 arrow 程序设计 arrow 在运行时将大图分割为小图片数组
在运行时将大图分割为小图片数组
Author Author: 一滴蔚蓝色 | Date Date: 2007-10-06 | View Count View: 990 | Section & Category 开发技术 - 程序设计 | Digg Digg: 0

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

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

 
<p>/**
 
 * Copyright_2006, eric zhan
 
 * Created on 2006-6-8
 
 */
 
package com.j2medev.image;</p>
<p>import javax.microedition.lcdui.Graphics;
 
import javax.microedition.lcdui.Image;</p>
<p>public class ImageUtil {</p>
<p> 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;
 
 }</p>
<p>}</p>

静态方法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来看看效果,代码如下:

 
<p>/**
 
 * Copyright_2006, eric zhan
 
 * Created on 2006-6-8
 
 */
 
package com.j2medev.image;</p>
<p>import java.io.IOException;</p>
<p>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;</p>
<p>public class ImageMIDlet extends MIDlet {</p>
<p> protected void destroyApp(boolean arg0) throws MIDletStateChangeException {</p>
<p> }</p>
<p> protected void pauseApp() {
 
  // TODO Auto-generated method stub</p>
<p> }</p>
<p> 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));</p>
<p> }</p>
<p>}</p>
<p>class ImageCanvas extends Canvas {</p>
<p> private Image img = null;</p>
<p> public ImageCanvas(Image _img) {
 
  this.img = _img;
 
 }</p>
<p> 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);
 
     }
 
    }
 
   }
 
  }
 
 }
 
}</p>


 

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


更多阅读:

 

尚无评论发表

我要发表评论

登录菜单

最新文章

订阅本站

RSS 0.91 RSS 1.0 RSS 2.0 ATOM 0.3 OPML