欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-01-12 19:16:58
...

  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. }   

 

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

  • J2me中任意角度图片旋转(二)
            
    
    博客分类: J2ME 算法GWT游戏AjaxJ# 
  • 描述: 初步实现效果
  • 大小: 430.3 KB