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 + -
显示快捷键?