服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

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

本文介绍如何在程序运行时将一个较大的图片分割为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,即可运行。我们建议图片的高度应该和行数成正比,图片的宽度与列数成正比。为了显示出分割的效果,这里把小图片之间加了一点间距。

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

扫描关注微信公众号