J2me中任意角度图片旋转
作者:pandonix
日期:2007年9月20日
版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
原文地址:
http://pandonix.iteye.com/
本文主要讨论在J2me中如何实现任意角度的图片旋转。其实,早在几年前,minisoyou的BB就已经给出了实现算法,相信做j2me游戏开发的朋友们也都收藏过该算法。本文从图像旋转的基本理论出发,详细讨论如何使用实现和优化该算法,希望对旋转算法感兴趣的朋友有帮助。
解决“坏点”仔细思考一下,坏点出现的主要原因在于,旋转公式的定义域是整个实数域,而像素点显然是离散点,因此,在进行映射时,会产生一定的误差,所以造成本该被定义的像素点,没有被映射到。其实,在图像处理领域,已经存在很多优化的算法,而且理论都基于数学的。 回到我们的问题,为了解决坏点,我们可以这样来考虑:改遍历原图像数组为遍历newPixels数组,这样就能保证所有的newPixels可以被覆盖。具体代码如下:
java 代码
- public static int[] rotate(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 x1,y1;
- int x2,y2;
- double cos = Math.cos(_angle);
- double sin = Math.sin(_angle);
- for(i = 0;i < r;i++)
- {
- for(j = 0;j < r;j++)
- {
- x1 = j + (- r)/2;
- y1 = i + (- r)/2;
- x2 = (int)(x1*cos + y1*sin);
- y2 = (int)(-x1*sin + y1*cos);
- if(x2 >= -_width/2&&x2< _width/2&&y2 >= -_height/2&&y2< _height/2)
- {
- int k = (y2 + _height/2)*_width+x2+_width/2;
-
- newPixels[i*r + j] = _pixels[k];
- }
- }
- }
- return newPixels;
- }
效果如图所示,基本上解决图像中的坏点,失真度基本可以接受。如果你觉得不符合要求,没关系,下面会介绍BB的算法。速度优化 上面这种算法的时间复杂程度是O(n^2),那么对该算法是否可以优化呢?参考了《A Fast Algorithm for Rotating Bitmaps》一文,可以对算法作以下优化:
- 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.javaBB的算法应该说,BB给出的算法的失真程度最小,他是对目标像素点进行了一个加权计算,但是,遗憾的是,翻阅了很多资料,我也没有找到该算法的相关理论介绍。若有朋友了解,请正解。具体代码请参考Rotation_4444.java总结与思考 总的说来,旋转后的位图都存在不同情况的失真,所以在实际开发过程中,需要视情况而定。除此之外,不同的终端对于透明的不同,例如,K700在透明方面问题就比较多。
- 描述: 优化后的效果
- 大小: 518.8 KB
分享到:
相关推荐
总之,J2ME中实现任意角度图片旋转涉及到像素操作、旋转计算、尺寸计算、性能优化等多个方面。通过理解基本的旋转原理和J2ME提供的图形API,我们可以有效地处理这些问题,实现高效且精确的图片旋转功能。
在J2ME中实现任意角度图片旋转是一项技术挑战,涉及到图像处理、数学计算以及设备兼容性等多个方面。本文主要探讨如何在J2ME环境中解决这些问题,以实现高效、准确的图片旋转。 首先,我们需要理解基本的图像旋转...
【标题】:“图片分类 J2ME中的图片处理” 【描述】:“图片的特点及分类;png图片的格式分析;图片在J2me中的应用。” 【标签】:“图片处理” “J2ME” “png” 在Java的移动开发领域,J2ME(Java 2 Micro ...
在这个特定的"j2me 图片处理特效"资源中,我们可以深入探讨几个关键的知识点。 首先,图片处理是移动应用开发中的重要部分,特别是在游戏和娱乐应用中。J2ME提供了基本的图像操作接口,如` javax.microedition....
本文将深入探讨标题“j2me中星星图片的各种处理”所涉及的知识点,包括图片旋转、数组操作以及线程控制与画布Sprite的使用。 首先,我们来关注图片旋转。在J2ME中,可以使用`Graphics`类提供的方法对图片进行旋转。...
在J2ME中,开发人员需要处理资源有限的环境,因此,提供中文输入功能是一个挑战,因为这需要在小型设备上实现复杂的字符编码和输入法。 本"J2ME中文输入Demo"旨在为开发者展示如何在J2ME环境中实现基本的中文输入...
《J2ME游戏素材——图片合集》 Java 2 Micro Edition(J2ME)是Java平台的一个子集,主要用于嵌入式设备和移动设备,尤其是手机。在J2ME中开发游戏,图像素材是至关重要的组成部分,它们赋予游戏视觉吸引力,使玩家...
J2ME中文教程 不错的学习资料,刚开始学习的可以参考下!
本教程将深入讲解J2ME在手机程序开发中的应用,帮助开发者掌握这一核心技术。 ### J2ME技术概述 J2ME由两大部分构成:配置(Configurations)和框架(Profiles)。配置定义了运行时环境的基本特性,如内存大小和...
总的来说,J2ME中的PNG图片压缩软件是开发过程中不可或缺的工具,它帮助开发者在保证图像质量的同时,优化应用资源,提升性能,为用户提供更好的体验。对于J2ME开发者而言,掌握这类工具的使用方法是至关重要的,...
在**J2ME中文API**中,主要包含以下几个核心部分: 1. **CLDC(Connected Limited Device Configuration)**:这是一个轻量级的Java虚拟机,用于资源有限的设备。它定义了运行时环境和基本类库。 2. **MIDP...
本文将深入探讨J2ME中旋转图形的核心知识点,包括使用的基本函数、步骤以及示例代码。 J2ME的图形渲染主要通过`Graphics`类来实现,它提供了一系列的方法用于绘制和操作2D图形。在J2ME中,我们可以使用`translate()...
本文将深入探讨如何在J2ME中处理和压缩PNG图片,通过实例代码帮助理解相关技术。 首先,PNG图片格式采用的是基于LZ77的无损压缩算法,这使得图像在压缩后仍能保持原始质量,但文件大小比未压缩的位图小很多。在J2ME...
4. **MIDP API详解**:MIDP是J2ME中用于创建移动应用的核心API,教程会详细介绍如何使用Canvas、Form、Item等组件进行用户界面设计,以及怎样利用 MIDP的网络功能实现数据通信。 5. **图形与多媒体**:J2ME支持丰富...
在J2ME中,RecordStore是用于存储非结构化数据的主要机制。开发者可以创建、读取、更新和删除RecordStore中的记录。此外,FileConnection API允许开发者访问设备的文件系统,进行文件的读写操作。 **游戏开发** ...
J2ME游戏开发中使用层的概念,J2ME编程学习,供初学者学习,含源码
在深入探讨J2ME中文API(HTML)的相关知识点前,我们先来了解一下J2ME的基本概念及其在移动设备开发中的重要性。J2ME,即Java 2 Platform, Micro Edition,是Sun Microsystems(现已被Oracle收购)推出的一种适用于...