操作系统  办公  实用知识  设计  开发  WEB开发  移动开发  数据库  软件工程  网管  安全  管理  信息化  答疑  渠道 

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

2007-9-30 网友评论 0 条 点击进入论坛

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

  算法实现

  排除了像素操作的障碍以后,就可以来实现旋转算法了。首先,考虑使用小数来实现该算法。接下来需要考虑的问题是,旋转后的图片的尺寸该设定为多大,因为其直接影响到旋转后的像素数组的大小。

  不考虑存储空间的情况下,可以如此定义尺寸:原图片矩形的外接圆的外切矩形,就是旋转后图片所在的矩形,如图所示。虽然,这样定义比较浪费空间,但是,原图片沿任意角度选择后的像素数组都可以被覆盖到。

  定义好尺寸之后,最基本的旋转算法就容易了,算法步骤如下:

  1、计算旋转后图片尺寸,并定义好旋转后像素数组newPixels[];

  2、将newPixels的各数组元素初始化为透明,即:0x0;

  3、按从左到右,从上到下的顺序,遍历原图片数组,计算出每个像素点旋转后的坐标,并将其复制到newPixels中

  算法代码如下:

  java 代码

  public static int[] rotate2(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 < _height; i++)

  {

  for(j = 0; j < _width; j++)

  {

  x1 = j + (- _width)/2;

  y1 = i + (- _height)/2;

  x2 = (int)(x1*cos - y1*sin);

  y2 = (int)(x1*sin + y1*cos);

  x2 += r/2;

  y2 += r/2;

  newPixels[y2*r+x2] = _pixels[i*_width+j];

  }

  }

  return newPixels;

  }

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

已有 0 位对此文章感兴趣的网友发布了看法    
我来评两句 登录邮箱: 密码:
  匿名发表
今日推荐
技术文库(共有 46430 篇文章)
操作系统
办公软件
实用知识
网络管理
软件开发
WEB开发
软件工程
数据库
设计在线
信息安全
行业信息化
管理信息化
重点推荐
电子杂志订阅
点击电子杂志名称查看样刊
输入E-mail地址即可订阅
E-mail