rotateimagemidlet.java

来自「example2 众多JAVA实例源码...学习java基础的好帮手」· Java 代码 · 共 122 行

JAVA
122
字号
package opusmicro.demos.image;

import java.io.IOException;

import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;

public class RotateImageMIDlet extends MIDlet{

	protected void destroyApp(boolean arg0) throws MIDletStateChangeException {}
	protected void pauseApp() {}
	protected void startApp() throws MIDletStateChangeException {
		Display.getDisplay(this).setCurrent(new RotateImageCanvas());
	}
}

class RotateImageCanvas extends Canvas{
	Image img;
	public RotateImageCanvas(){
		try {
			img = Image.createImage("/welcome.png");
		}
		catch (IOException e) {
			e.printStackTrace();
		}
	}
	/**
	 * 
	 * @param imgSource
	 *            源图像
	 * @param cx
	 *            旋转点相对于源图像坐上角横坐标
	 * @param cy
	 *            旋转点相对于源图像坐上角纵坐标
	 * @param theta
	 *            图像逆时针旋转的角度
	 * @param dd
	 *            含2个元素的整形数组,存放新图像相对源图像沿x轴和y轴的位置偏移量
	 * @return 旋转后的图像
	 */

	public Image rotate(Image imgSource, int cx, int cy, double theta, int[] dd) {
		if (Math.abs(theta % 360) < 0.1) return imgSource; // 角度很小时直接返回
		int w1 = imgSource.getWidth(); // 原始图像的高度和宽度
		int h1 = imgSource.getHeight();
		int[] srcMap = new int[w1 * h1];
		imgSource.getRGB(srcMap, 0, w1, 0, 0, w1, h1); // 获取原始图像的像素信息
		int dx = cx > w1 / 2 ? cx : w1 - cx; // 计算旋转半径
		int dy = cy > h1 / 2 ? cy : h1 - cy;
		double dr = Math.sqrt(dx * dx + dy * dy);
		int wh2 = (int) (2 * dr ); // 旋转后新图像为正方形,其边长+1是为了防止数组越界
		int[] destMap = new int[wh2 * wh2]; // 存放新图像象素的数组
//		for(int i=0;i<destMap.length;i++){
//			destMap[i] = (0x0)<<24; //新图像象素的数组元素初始化为透明
//		}
		double destX, destY;
		double radian = theta * Math.PI / 180; // 计算角度计算对应的弧度值
		for (int i = 0; i < w1; i++) {
			for (int j = 0; j < h1; j++) {
				if (srcMap[j * w1 + i] >> 24 != 0) { // 对非透明点才进行处理
					// 得到当前点经旋转后相对于新图像左上角的坐标
					destX = dr + (i - cx) * Math.cos(radian) + (j - cy)* Math.sin(radian);
					destY = dr + (j - cy) * Math.cos(radian) - (i - cx)* Math.sin(radian);
					// 从源图像中往新图像中填充像素
					destMap[(int) destY * wh2 + (int) destX] = srcMap[j * w1 + i];
				}
			}
		}
		dd[0] = (int) (cx-dr); // 返回位置偏移分量
		dd[1] = (int) (cy-dr);
		return Image.createRGBImage(destMap, wh2, wh2, true); // 返回旋转后的图像
	}

	protected void paint(Graphics g) {
//		g.setColor(0xff);
//		g.fillRect(0, 0, getWidth(), getHeight());
		g.drawImage(img, 0, 0, 0);
		int dd[] = new int[2];
		Image image = rotate(img,img.getWidth()/2,img.getHeight()/2,163,dd);
		g.drawImage(image, 0, 60, 0);
		int[] pixels = new int[img.getWidth()*img.getHeight()];
		img.getRGB(pixels, 0, img.getWidth(), 0, 0, img.getWidth(), img.getHeight());
		int[] im = rotate3(pixels,img.getWidth(),img.getHeight(),40);
		Image ima = Image.createRGBImage(im, img.getWidth(), img.getHeight(), true);
		g.drawImage(ima, 0, getHeight()/2, 0);
	}
	
	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] = (0x0)<<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;
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?