J2me中任意角度图片旋转(3)
J2me中任意角度图片旋转(三)? J2me中任意角度图片旋转? public?static?int[]?rotate3(int[]?_pixels,int?_
J2me中任意角度图片旋转(三)
? J2me中任意角度图片旋转
?
- public?static?int[]?rotate3(int[]?_pixels,int?_width,int?_height,double?_angle) ?? { ??
- ????int?i,j; ?? ????double?radius?=?Math.sqrt(_width*_width?+?_height*_height); ??
- ????int?r?=?(int)radius; ?? ????int[]?newPixels?=?new?int[r*r]; ??
- ????for(i?=?0;?i?<?newPixels.length;i++) ?? ????{ ??
- ????????????newPixels[i]?=?(TRANSPARENT)<<24; ?? ????} ??
- ????double?x2,y2; ?? ????int?x3,y3; ??
- ????double?cos?=?Math.cos(_angle); ?? ????double?sin?=?Math.sin(_angle); ??
- ????for(i?=?0;i?<?r;i++) ?? ????{ ??
- ????????x2?=?(-r/2)*cos?+?(i?-?r/2)*sin; ?? ????????y2?=?(r/2)*sin?+?(i?-?r/2)*cos; ??
- ????????x3?=?(int)x2; ?? ????????y3?=?(int)y2; ??
- ????????for(j?=?0;j?<?r;j++) ?? ????????{ ??
- ????????????if(x3?>=?-_width/2&&x3<?_width/2&&y3?>=?-_height/2&&y3<?_height/2) ?? ????????????{ ??
- ????????????????newPixels[i*r?+j]?=?_pixels[(y3?+?_height/2)*_width+x3+_width/2]; ?? ????????????} ??
- ????????????x2?+=?cos; ?? ????????????y2?-=?sin; ??
- ????????????x3?=?(int)x2; ?? ????????????y3?=?(int)y2; ??
- ????????} ?? ????} ??
- ????return?newPixels; ?? } ??
?
使用定点数实现其实,主要就是实现Sin和Cos的求值,基本思路是:将Sin和Cos值放大255倍,进行计算以后,对结果再进行缩小处理,具体请参考代码Rotation2.java
BB的算法应该说,BB给出的算法的失真程度最小,他是对目标像素点进行了一个加权计算,但是,遗憾的是,翻阅了很多资料,我也没有找到该算法的相关理论介绍。若有朋友了解,请正解。具体代码请参考Rotation_4444.java
总结与思考 总的说来,旋转后的位图都存在不同情况的失真,所以在实际开发过程中,需要视情况而定。除此之外,不同的终端对于透明的不同,例如,K700在透明方面问题就比较多。
1 楼 pandonix 2007-09-21 网速太慢,代码明天再传 2 楼 wuhua 2007-10-05 不错,支持写的很详细