J2ME MIDP2.0包括自己的方法:
public static Image createImage(Image image, int x, int y, int width, int height, int transform)
其中:transform就可以指定要做的操作,比如水平镜像,转90度等
本例的代码取自我写的上阳图像处理演示程序(ImageAlbum),自己实现的方法,提供另一种思路。大家应该尽量使用系统内置的API
/*************************************************************************** * * 旋转90度的方法 */ public static Image turn90(Image img) { // int[] rgbOutput = null; int[] rgbInput = null; int width = 0, height = 0; int[][] tempArr = null; int[][] tempArr1 = null; try { width = img.getWidth(); height = img.getHeight(); rgbInput = new int[width * height]; // rgbOutput = new int[width * height]; img.getRGB(rgbInput, 0, width, 0, 0, width, height); int i, j, k; k = 0; tempArr = new int[height][width]; for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { tempArr[i][j] = rgbInput[k++]; } } rgbInput = null; // 显式地设置为空值,告诉系统可以垃圾回收 k = 0; tempArr1 = new int[width][height]; for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { tempArr1[j][i] = tempArr[i][j]; } } tempArr = null; // 显式地设置为空值,告诉系统可以垃圾回收 // 不调用这个方法,不是顺时针90度 Image result = verticalMirror(tempArr1, height, width); // k = 0; // for (i = 0; i < width; i++) { // for (j = 0; j < height; j++) { // rgbOutput[k] = tempArr1[i][j]; // k++; // } // } // tempArr1 = null;// 显式地设置为空值,告诉系统可以垃圾回收 // // 不调用这个方法,不是顺时针90度 // Image result = verticalMirror(rgbOutput, height, width); if (result == null) { // 水平镜像的时候出问题,内存不够了,返回原来的图,不做修改 return img; } else { return result; } // return Image.createRGBImage(rgbOutput, height, width, true); } catch (OutOfMemoryError e) { // e.printStackTrace(); ImageAlbum.showAlert("图像尺寸太大,不能完成此操作."); return img; } finally { } } /*************************************************************************** * * 旋转180度的方法 */ public static Image turn180(Image img) { int[] rgbOutput = null; int[] rgbInput = null; int width = 0, height = 0; int[][] tempArr = null; try { width = img.getWidth(); height = img.getHeight(); rgbInput = new int[width * height]; rgbOutput = new int[width * height]; img.getRGB(rgbInput, 0, width, 0, 0, width, height); int i, j, k; k = 0; tempArr = new int[height][width]; for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { tempArr[i][j] = rgbInput[k++]; } } rgbInput = null; // 显式地设置为空值,告诉系统可以垃圾回收 k = 0; for (i = height - 1; i >= 0; i--) { for (j = width - 1; j >= 0; j--) { rgbOutput[k] = tempArr[i][j]; k++; } } tempArr = null; // 显式地设置为空值,告诉系统可以垃圾回收 // return img; return Image.createRGBImage(rgbOutput, width, height, true); } catch (OutOfMemoryError e) { // e.printStackTrace(); ImageAlbum.showAlert("图像尺寸太大,不能完成此操作."); return img; } finally { rgbOutput = null; } } /*************************************************************************** * * 垂直镜像的私有方法,被turn90调用 */ private static Image verticalMirror(int[][] tempArr, int width, int height) { int[] rgbOutput = null; int[][] tempArr1 = null; try { rgbOutput = new int[width * height]; int i, j, k; k = 0; tempArr1 = new int[height][width]; for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { tempArr1[i][width - 1 - j] = tempArr[i][j]; } } tempArr = null; // 显式地设置为空值,告诉系统可以垃圾回收 k = 0; for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { rgbOutput[k] = tempArr1[i][j]; k++; } } tempArr1 = null; // 显式地设置为空值,告诉系统可以垃圾回收 // return img; return Image.createRGBImage(rgbOutput, width, height, true); } catch (OutOfMemoryError e) { e.printStackTrace(); return null; } finally { rgbOutput = null; } }
转自: http://blog.csdn.net/the3gwireless