J2me中任意角度图片旋转(一)

  J2me中任意角度图片旋转

作者:pandonix

日期:2007年9月20日

版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明

原文地址:

http://pandonix.iteye.com/

 

本文主要讨论在J2me中如何实现任意角度的图片旋转。其实,早在几年前,minisoyou的BB就已经给出了实现算法,相信做j2me游戏开发的朋友们也都收藏过该算法。本文从图像旋转的基本理论出发,详细讨论如何使用实现和优化该算法,希望对旋转算法感兴趣的朋友有帮助。

  基本旋转算法:

讨论位图旋转算法,首先得说说最基本的旋转算法,即:点的旋转。相信学过计算机图形学的朋友们,对该算法不会陌生。

假设,P(x,y)旋转t角度后,得到P’(x’,y’),P与P’之间的关系如下:

(x’,y’) = (x cos(t) + y sin(t),y cos(t) - x sin(t))

  位图旋转:

根据以上算法,可以直观的想到位图旋转算法,即遍历位图中的所有像素点,对每个像素点进行旋转变换。

但是在j2me中真正实现位图的旋转,还需要解决以下几点问题:

1、如何获取图片的像素数组,且得到的像素值是包含了alpha高位的,换句话说,要支持透明;

2、由于是任意角度旋转,旋转后的图像尺寸如何计算;

3、旋转算法可以优化,提高计算速度;

4、旋转得到的像素数组,如何绘制到canvas上;

5、旋转后能否直接得到一个Image对象;

6、旋转算法都是基于小数运算的,在CLDC1.0的设备上,如何实现旋转;

7、旋转后的图像是否存在失真;

  J2me 中的像素操作 熟悉 j2me 的朋友对于问题一的回答应该是肯定的。我们有两种方法获取像素数组,一种是使用 midp2.0 中的 getRGB 方法,另一种是使用 NokiaUI 中的 getPixels 方法,两种方法各有优缺点。其中, getRGB 方法并非所有 midp2.0 都手机都支持,本人在 Nokia6600 上面使用该方法就出现问题,除此之外, getRGB 只能获取到 8888 格式的 ARGB 像素值,即通常说的 256 色。而 NokiaUI 重载了三个 getPixels 方法,不仅支持 8888 格式,还支持 4444 格式,即,可以使用 short 数组来存储像素值,而无须使用 int 数组。

由于getRGB方法很简单,参考API文档就能使用,所以,在此只列出NokiaUI中如何获取像素数组:

java 代码
  1. public short[] pixelsProduce(Image src)   
  2. {   
  3.     int w = src.getWidth();   
  4.     int h = src.getHeight();   
  5.     short[] _pixels = new short[w * h];   
  6.     //创建可变图像   
  7.     Image img = DirectUtils.createImage(w, h, 0);   
  8.     Graphics g = img.getGraphics();   
  9.     DirectGraphics dg = DirectUtils.getDirectGraphics(g);   
  10.     //先将原图绘制到创建好的可变图像上   
  11.     dg.drawImage(src,0,0,0,0);   
  12.     //再获取该可变图像的像素数组   
  13.     dg.getPixels(_pixels,0, w, 00, w, h,4444);   
  14.     return _pixels;   
  15. }   
 

解决了获取图片像素数组的问题,绘制旋转后的像素数组的问题也迎刃而解了。Midp2.0中,可以使用drawRGB,而NokiaUI中,则使用drawPixels。当然,如果考虑到绘制的效率,可以将像素数组转化为Image对象,这样虽然创建时耗费了时间,但是在绘制时,却比直接绘制像素数组更加有效率。为此,Midp2.0中,可使用Image.createRGBImage方法,而NokiaUI中,则可以采用以下方法来获取Image对象:

java 代码
  1. public Image createImg(short[] pixels,int _width,int _height)   
  2. {   
  3.     //创建可变图像   
  4.     Image img = DirectUtils.createImage(_width, _height, 0);   
  5.     Graphics g = img.getGraphics();   
  6.     DirectGraphics dg = DirectUtils.getDirectGraphics(g);   
  7.     //将像素数组绘制到创建好的可变图像上   
  8.     dg.drawPixels(pixels, true0, _width, 00, _width, _height, 0,4444);   
  9.     return img;   
  10. }   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值