首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2ME开发 >

关于J2ME图片放大缩小算法的疑问!该如何处理

2012-01-21 
关于J2ME图片放大缩小算法的疑问!!privateImageZoomImage(ImagesrcImg,intdesW,intdesH){intsrcWsrcImg.g

关于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()来画图。

热点排行