日期:2014-05-20  浏览次数:20646 次

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

? J2me中任意角度图片旋转

??

作者:pandonix

日期:2007920

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

原文地址:

http://pandonix.iteye.com/

?

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

算法实现排除了像素操作的障碍以后,就可以来实现旋转算法了。首先,考虑使用小数来实现该算法。接下来需要考虑的问题是,旋转后的图片的尺寸该设定为多大,因为其直接影响到旋转后的像素数组的大小。不考虑存储空间的情况下,可以如此定义尺寸:原图片矩形的外接圆的外切矩形,就是旋转后图片所在的矩形,如图所示。虽然,这样定义比较浪费空间,但是,原图片沿任意角度选择后的像素数组都可以被覆盖到。定义好尺寸之后,最基本的旋转算法就容易了,算法步骤如下:1、计算旋转后图片尺寸,并定义好旋转后像素数组newPixels[]2、将newPixels的各数组元素初始化为透明,即:0x03、按从左到右,从上到下的顺序,遍历原图片数组,计算出每个像素点旋转后的坐标,并将其复制到newPixels

算法代码如下:

java 代码
  1. public?static?int[]?rotate2(int[]?_pixels,int?_width,int?_height,double?_angle) ??
  2. { ??
  3. ????int?i,j; ??
  4. ????double?radius?=?Math.sqrt(_width*_width?+?_height*_height); ??
  5. ????int?r?=?(int)radius; ??
  6. ????int[]?newPixels?=?new?int[r*r]; ??
  7. ????for(i?=?0;?i?<?newPixels.length;i++) ??
  8. ????{ ??
  9. ????????????newPixels[i]?=?(TRANSPARENT)<<24; ??
  10. ????} ??
  11. ????double?x1,y1; ??
  12. ????int?x2,y2; ??
  13. ????double?cos?=?Math.cos(_angle); ??
  14. ????double?sin?=?Math.sin(_angle); ??
  15. ????for(i?=?0;?i?<?_height;i++) ??
  16. ????{ ??
  17. ????????for(j?=?0;j?<?_width;j++) ??
  18. ????????{ ??
  19. ????????????x1?=?j?+?(-?_width)/2; ??
  20. ????????????y1?=?i?+?(-?_height)/2; ??
  21. ????????????x2?=?(int)(x1*cos?-?y1*sin); ??
  22. ????????????y2?=?(int)(x1*sin?+?y1*cos); ??
  23. ????????????x2?+=?r/2; ??
  24. ????????????y2?+=?r/2; ??
  25. ????????????newPixels[y2*r+x2]?=?_pixels[i*_width+j]; ??
  26. ????????} ??
  27. ????} ??
  28. ????return?newPixels; ??
  29. } ??

?

实现后的效果如图所示,基本上实现了旋转。但遗憾的是,旋转后的图像明显存在“坏点”,在图像中,有很多像素点没有被映射到,所以没有像素值,造成了该点仍然是透明的。而且,图片的失真程度不能接受。

1 楼 纯情小火鸡 2008-03-27  
  我最近做的一个任务是用GWT做的,这个是面向JAVA的开发AJAX的框架,现在就是我有一系列不同角度的图片,要做出来让他有个旋转的效果,就是我鼠标把当前图向右转下,就会显示向右的角度的图片,再继续用鼠标操作让他继续能够旋转,看上去有个旋转的效果,实际上每当鼠标操作了一下是加载了不同方向的图片对吧,