文谷首页 | 业界传真 | 网络技术 | 服务器 | 数据库 | 存储技术 | 系统安全 | 无线技术 | Cisco | .Net | Windows | Linux | Unix | Java
电子商务 | 网站工程 | 网页设计 | 平面设计 | 多媒体 | 编程语言 | Oracle | MSSQL | Photoshop | ASP | PHP | 实用技巧 | 进程查询 | 文谷论坛
Java频道
 资讯动态   考试认证   新手入门   核心技术   高级技术   J2EE   J2ME   XML   开源技术   其他技术
您现在的位置: IT文谷 >> 开发平台 >> Java >> J2ME >> 嵌入式 >> 文章正文
在运行时将大图分割为小图片数组在运行时将大图分割为小图片数组2006-7-19 23:16:50在运行时将大图分割为小图片数组2006-7-19 23:16:50在运行时将大图分割为小图片数组
在运行时将大图分割为小图片数组
在运行时将大图分割为小图片数组在运行时将大图分割为小图片数组2006-7-19 23:16:50在运行时将大图分割为小图片数组2006-7-19 23:16:50在运行时将大图分割为小图片数组
在运行时将大图分割为小图片数组在运行时将大图分割为小图片数组2006-7-19 23:16:50在运行时将大图分割为小图片数组2006-7-19 23:16:50在运行时将大图分割为小图片数组

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


在运行时将大图分割为小图片数组在运行时将大图分割为小图片数组2006-7-19 23:16:50在运行时将大图分割为小图片数组2006-7-19 23:16:50在运行时将大图分割为小图片数组
  • 上一篇文章:

  • 下一篇文章:
  • 进入论坛讨论

    相关文章
    我的Thinking in Java学习笔记
    使用JBoss和Eclipse创建J2EE应用
    SpringFramework(9)
    NoTitle385
    向Web Service进军--Axis+Tomcat模拟一个银行存取款
    JAVA中的指针,引用及对象的clone
    JAVA中用动态代理类实现记忆功能(二)
    JAVA中用动态代理类实现记忆功能(一)
    DB Test
    基金系统的初步研究(1)
    SpringFramework(8)
    深入浅出Java clone技术(2)
    热门文章最新推荐

    版权与免责声明:
    ① 本网转载其他媒体稿件是为传播更多的信息,此类稿件不代表本网观点,版权归原作者所有,本网不承担此类稿件侵权行为的连带责任。
    ② 本站原创文章,转载时请注明出自文谷及作者姓名
    ③在本网BBS上发表言论者,文责自负。
    ④如您因版权等问题需要与本网联络,请在30日内联系 。
    在运行时将大图分割为小图片数组在运行时将大图分割为小图片数组2006-7-19 23:16:50在运行时将大图分割为小图片数组2006-7-19 23:16:50在运行时将大图分割为小图片数组
    在运行时将大图分割为小图片数组在运行时将大图分割为小图片数组2006-7-19 23:16:50在运行时将大图分割为小图片数组2006-7-19 23:16:50在运行时将大图分割为小图片数组

    全站热点
    最新推荐
    关于文谷 | 联系文谷 | 免责声明 | 文谷论坛
    Tel: 0577-65690019      E-mail: ichenjian@gmail.com    MSN:ichenjian@hotmail.com    QQ:2911194
    Copyright © 2004-2008 wengu.com 文谷 All Rights Reserved
    浙ICP备05000327号