public static Image ZoomImage(Image src, int desW, int desH) { Image desImg = null; int srcW = src.getWidth(); // 原始图像宽 int srcH = src.getHeight(); // 原始图像高 int[] srcBuf = new int[srcW * srcH]; // 原始图片像素信息缓存
src.getRGB(srcBuf, 0, srcW, 0, 0, srcW, srcH);
// 计算插值表 int[] tabY = new int[desH]; int[] tabX = new int[desW];
int sb = 0; int db = 0; int tems = 0; int temd = 0; int distance = srcH > desH ? srcH : desH; for (int i = 0; i <= distance; i++) { /* 垂直方向 */ tabY[db] = sb; tems += srcH; temd += desH; if (tems > distance) { tems -= distance; sb++; } if (temd > distance) { temd -= distance; db++; } }
sb = 0; db = 0; tems = 0; temd = 0; distance = srcW > desW ? srcW : desW; for (int i = 0; i <= distance; i++) { /* 水平方向 */ tabX[db] = (short) sb; tems += srcW; temd += desW; if (tems > distance) { tems -= distance; sb++; } if (temd > distance) { temd -= distance; db++; } }
// 生成放大缩小后图形像素buf int[] desBuf = new int[desW * desH]; int dx = 0; int dy = 0; int sy = 0; int oldy = -1; for (int i = 0; i < desH; i++) { if (oldy == tabY[i]) { System.arraycopy(desBuf, dy - desW, desBuf, dy, desW); } else { dx = 0; for (int j = 0; j < desW; j++) { desBuf[dy + dx] = srcBuf[sy + tabX[j]]; dx++; } sy += (tabY[i] - oldy) * srcW; } oldy = tabY[i]; dy += desW; }
// 生成图片 desImg = Image.createRGBImage(desBuf, desW, desH, false); return desImg; }
这个函数是我以前在网上搜罗到的,且不谈效果,性能什么的。只觉得它非常好用。 用了很长时间,可惜不知道是谁。真要谢谢这位作者了。 这个函数使用了midp2.0的getRGB()函数,效率不错,基本上没什么可优化的了。 此外,下面再提供一个midp1.0下可用的缩放函数,它是使用可变图片实现的。可惜这个函数也不是我写的。 转载于kobjects。不过性能确实比较差,毕竟要画那么多点嘛,跟处理图片数据的方法是没有可比性的。
1 /* Copyright (c) 2002,2003, Stefan Haustein, Oberhausen, Rhld., Germany 2 * 3 * Permission is hereby granted, free of charge, to any person obtaining a copy 4 * of this software and associated documentation files (the “Software”), to deal 5 * in the Software without restriction, including without limitation the rights 6 * to use, copy, modify, merge, publish, distribute, sublicense, and/or 7 * sell copies of the Software, and to permit persons to whom the Software is 8 * furnished to do so, subject to the following conditions: 9 * 10 * The above copyright notice and this permission notice shall be included in 11 * all copies or substantial portions of the Software. 12 * 13 * THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 18 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 19 * IN THE SOFTWARE. */ 20 21 package org.kobjects.lcdui; 22 23 24 import javax.microedition.lcdui.*; 25 26 27 /** This class provides a single static method that allows to scale an image */ 28 29 30 public class ScaleImage { 31 32 /** 33 * Creates a new, scaled version of the given image. 34 * 35 * @param src: The source image 36 * @param dstW: The destination (scaled) image width 37 * @param dstH: The destination (scaled) image height 38 * @return Image: A new Image object with the given width and height. 39 */ 40 41 public static Image scaleImage (Image src, int dstW, int dstH) { 42 int srcW = src.getWidth(); 43 int srcH = src.getHeight(); 44 45 Image tmp = Image.createImage(dstW, srcH); 46 Graphics g = tmp.getGraphics(); 47 48 int delta = (srcW << 16) / dstW; 49 int pos = delta/2; 50 51 for (int x = 0; x < dstW; x++) { 52 g.setClip(x, 0, 1, srcH); 53 g.drawImage(src, x - (pos >> 16), 0, Graphics.LEFT | Graphics.TOP); 54 pos += delta; 55 } 56 57 Image dst = Image.createImage(dstW, dstH); 58 g = dst.getGraphics(); 59 60 delta = (srcH << 16) / dstH; 61 pos = delta/2; 62 63 for (int y = 0; y < dstH; y++) { 64 g.setClip(0, y, dstW, 1); 65 g.drawImage(tmp, 0, y - (pos >> 16), Graphics.LEFT | Graphics.TOP); 66 pos += delta; 67 } 68 69 return dst; 70 } 71 72 73 }
它们的使用方法都是一目了然,提供原始图片对象以及目标宽度跟高度,它就生成新的图片,在成像效果上,感觉都差不多,我觉得第一个方法更好。 在J2ME平台下,也没有必要去最求效果的极致,够用就好。再次感谢以上两个函数的作者。 |