J2ME经验总结之图片缩放

 


作者: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;
 }

这个函数是我以前在网上搜罗到的,且不谈效果,性能什么的。只觉得它非常好用。
用了很长时间,可惜不知道是谁。真要谢谢这位作者了。
这个函数使用了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平台下,也没有必要去最求效果的极致,够用就好。再次感谢以上两个函数的作者。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值