作者:hunhun1981
出自:http://blog.csdn.net/hunhun1981/
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;
}
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 }
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平台下,也没有必要去最求效果的极致,够用就好。再次感谢以上两个函数的作者。
更多信息,请关注hunhun1981的专栏 。