首 页 | 新 闻 | Symbian | Windows Mobile| J2ME | 下载中心 | 游戏策划 | 购书指南 | 移动开发视频教程
您现在的位置: 开发视界 >> J2ME >> 界面UI >> 文章正文
J2ME经验总结之图片缩放
作者:hunhun19…    文章来源:blog.csdn.net/hunhun1981    更新时间:2007-10-18 9:54:01
 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, 00, 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, 01, 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平台下,也没有必要去最求效果的极致,够用就好。再次感谢以上两个函数的作者。

相关文章:
没有相关文章