关于J2ME图片放大缩小算法的疑问!!
private Image ZoomImage(Image srcImg, int desW, int desH) {
int srcW = srcImg.getWidth(); //原始图像宽
int srcH = srcImg.getHeight(); //原始图像高
//计算插值表
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] = sb;
tems += srcW;
temd += desW;
if (tems > distance) {
tems -= distance;
sb++;
}
if (temd > distance) {
temd -= distance;
db++;
}
}
System.out.println((Runtime.getRuntime().freeMemory()/1024));
//生成放大缩小后图形像素buf
Image desImg = Image.createImage(desW,desH);
Graphics gs= desImg.getGraphics();
int dx = 0;
int oldy = -1;
int[] srcBuf = new int[srcW];
int[] desBuf = new int[desW];
int[] lastRow = new int[desW];
for (int i = 0; i < desH; i++) {
if (oldy == tabY[i]) {
//当上一行与即将要生成的这一行相同时,就直接copy了
System.arraycopy(lastRow, 0, desBuf, 0, desW);
} else {//插值算出新图片的一行
dx = tabY[i];
srcImg.getRGB(srcBuf, 0, srcW, 0, dx, srcW, 1);
//插值一行,就从原图中取一行数据
for (int j = 0; j < desW; j++) {
desBuf[j] = srcBuf[tabX[j]];
}
//dx++;
}
System.arraycopy(desBuf, 0, lastRow, 0, desW);
oldy = tabY[i];
gs.drawRGB(desBuf, 0, desW, 0, i, desW, 1, false);
}
return desImg;
}
上面是http://www.j2medev.com/bbs/dispbbs.asp?boardid=2&ID=22317&replyID=82497关于图片变大缩小的算法,可是我处理了一张背景透明的图片,结果处理后的图片背景变成白色了,我该怎么保证缩放后的图片背景色仍为透明呢!!
[解决办法]
看看這里啊
http://www.j2medev.com/Article/ShowArticle.asp?ArticleID=169
他在最后說了這么解決的哈~
最后要说明一点的是,由于该算法中使用了Image.createImage(w, h)来创建图像,这个函数会创建一个w*h像素的全白可变图像,所以透明图片放大缩小后,背景不再透明,而是白色了,这是j2me本身的缺憾和算法没有关系。对于这个问题,有一个解决办法,就是程序的图片不采用Image来保存,而是采用short[]数组保存,画图的时候用drawPixels()来画图。