精彩的人生

          好好工作,好好生活

          BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
            147 Posts :: 0 Stories :: 250 Comments :: 0 Trackbacks

          java中的圖片處理是很讓人頭疼的一件事情。目前java api中的imageIO可以將gif圖片轉(zhuǎn)換成png圖片,jpg圖片可以正常轉(zhuǎn)換。據(jù)說gif轉(zhuǎn)jpg也是有辦法的,但是將jpg轉(zhuǎn)成gif,我費(fèi)了很大的工夫才找到一個(gè)很好的解決方案。

           

          首先介紹的是一段很好的縮放圖片的代碼::
          public static BufferedImage resize(BufferedImage source, int targetW, int targetH) {
              
          // targetW,targetH分別表示目標(biāo)長(zhǎng)和寬
                  int type = source.getType();
                  BufferedImage target 
          = null;
                  
          double sx = (double) targetW / source.getWidth();
                  
          double sy = (double) targetH / source.getHeight();

                  
          //這里想實(shí)現(xiàn)在targetW,targetH范圍內(nèi)實(shí)現(xiàn)等比縮放。如果不需要等比縮放
                  
          //則將下面的if else語(yǔ)句注釋即可
                  if(sx>sy)
                  
          {
                      sx 
          = sy;
                      targetW 
          = (int)(sx * source.getWidth());
                  }
          else{
                      sy 
          = sx;
                      targetH 
          = (int)(sy * source.getHeight());
                  }


                  
          if (type == BufferedImage.TYPE_CUSTOM) //handmade
                      ColorModel cm = source.getColorModel();
                      WritableRaster raster 
          = cm.createCompatibleWritableRaster(targetW, targetH);
                      
          boolean alphaPremultiplied = cm.isAlphaPremultiplied();
                      target 
          = new BufferedImage(cm, raster, alphaPremultiplied, null);
                  }
           else
                      target 
          = new BufferedImage(targetW, targetH, type);
                  Graphics2D g 
          = target.createGraphics();
                  
          //smoother than exlax:
                  g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);


                  g.drawRenderedImage(source, AffineTransform.getScaleInstance(sx, sy));
                  g.dispose();
                  
          return target;
              }


          接下來是將InputStream保存為jpg文件
          public static void saveImageAsJpg (InputStream in, File saveFile,int width,int hight)    
                      
          throws Exception {
                  BufferedImage srcImage;

                  srcImage 
          = ImageIO.read(in);

                  
          if(width > 0 || hight > 0)
                  
          {
                       srcImage 
          = resize(srcImage, width, hight);
                  }


                  ImageIO.write(srcImage, 
          "JPEG", saveFile);
                  in.close();
              }


          參數(shù)解釋:

          in::是一個(gè)jpg圖片的InputStream

          saveFile::目標(biāo)文件

          width::目標(biāo)寬度,如果不需要縮放則置0

          hight::目標(biāo)高度,如果不需要縮放則置0

           

           

          然后是將InputStream保存為gif文件:
          private static void saveImageAsGif(InputStream in, File fileToSave,int width, int hight)
                      
          throws Exception {
                  BufferedImage srcImage;

                  srcImage 
          = ImageIO.read(in);

                  
          if(width>0 && hight >0)
                  
          {
                       srcImage 
          = resize(srcImage, width, hight);
                  }


                  FileOutputStream out 
          = new FileOutputStream(fileToSave);
                  GifEncoder encoder 
          = new GifEncoder(srcImage, out);
                  encoder.encode();

                  in.close();
              }


          參數(shù)解釋:

          in::是一個(gè)jpg或者gif圖片的InputStream

          saveFile::目標(biāo)文件

          width::目標(biāo)寬度,如果不需要縮放則置0

          hight::目標(biāo)高度,如果不需要縮放則置0

           

          GifEncoder這個(gè)類是java api中沒有的,也是我找尋了很久的一個(gè)東西。它是Acme.JPM.Encoders.GifEncoder,只要找到這個(gè)包,將jpg轉(zhuǎn)為gif就不是問題了。

           

           

          Jpg圖片使用的是24-bit的編碼,pngpng-24png-8兩種,但是gif8-bit的編碼。如果強(qiáng)行將jpg圖片信息流按字節(jié)拆開,轉(zhuǎn)換成gif圖片,即使使用標(biāo)準(zhǔn)256色,也會(huì)出現(xiàn)嚴(yán)重的失真。

           

          我曾經(jīng)使用了gif4j_light_trial_1.0.jar這個(gè)包,但是這個(gè)包讓我很失望。盡管它可以將多張圖片合成一個(gè)動(dòng)態(tài)的gif圖片,但是它是付費(fèi)的,免費(fèi)使用期只有一個(gè)月。并且,在使用它將jpg圖片轉(zhuǎn)換成gif圖片之后中間會(huì)有一條白色的橫線,不知道這是系統(tǒng)的缺陷還是在費(fèi)用包中做的手腳。

          posted on 2005-11-27 12:53 hopeshared 閱讀(5056) 評(píng)論(17)  編輯  收藏 所屬分類: Java

          Feedback

          # re: 2005.6.12 圖片處理 2005-12-04 17:02 jFresH_MaN
          jdk自帶了對(duì)圖片進(jìn)行codec的包
          是sun.awt.image.codec.*  回復(fù)  更多評(píng)論
            

          # re: 2005.6.12 圖片處理 2005-12-08 09:47 zz
          您好,我找不到Acme.JPM.Encoders.GifEncoder的下載地址,你能給我一份嗎,jgszz@163.com,多謝  回復(fù)  更多評(píng)論
            

          # re: 2005.6.12 圖片處理 2005-12-08 21:01 hopeshared
          這個(gè)類在openmap.jar中,下載地址是

          http://iron.gps.caltech.edu/trinet_tpp_doc/v1.5/download/openmap.jar  回復(fù)  更多評(píng)論
            

          # re: 2005.6.12 圖片處理 2006-01-13 20:09 zhangbo2976@hotmail.com
          我試了,將GIF進(jìn)行縮放只,得到的GIF只顯示第一楨的,
          我找了好多方法進(jìn)行處理,
          過程是,將GIF一楨一楨進(jìn)行解碼取出,然后再進(jìn)行重新生成GIF的圖,
          但這樣處理感覺走了彎路。。。。  回復(fù)  更多評(píng)論
            

          # re: 2005.6.12 圖片處理 2006-05-15 14:53 路過
          內(nèi)容不錯(cuò),所以特點(diǎn)點(diǎn)了一下你的廣告,回報(bào)一下  回復(fù)  更多評(píng)論
            

          # re: 2005.6.12 圖片處理 2006-05-17 13:48 bghtiaoliangxiaochou@hotmail.com
          你好:

          請(qǐng)教:
          我通過
          URL url= new URL("http://img.us.cyworld.com/image/main/beta_logo.gif");
          獲得了
          InputStream is = url.openStream ();
          我如何才能夠?qū)⑦@個(gè)InputStream存儲(chǔ)成本的gif文件!
          希望能夠得到您的幫助!
          謝謝!
            回復(fù)  更多評(píng)論
            

          # re: 2005.6.12 圖片處理 2006-05-17 15:32 hopeshared
          這個(gè)問題其實(shí)就是單純的將InputStream保存成文件的問題,晚上給答案(當(dāng)前時(shí)刻手上沒有現(xiàn)成的代碼,呵呵)  回復(fù)  更多評(píng)論
            

          # re: 2005.6.12 圖片處理 2006-05-18 09:43 bghtiaoliangxiaochou@hotmail.com
          問題已經(jīng)解決,謝謝!
          還有的個(gè)問題:
          請(qǐng)問:Acme.JPM.Encoders.GifEncoder是免費(fèi)使用的嗎??
            回復(fù)  更多評(píng)論
            

          # re: 2005.6.12 圖片處理 2006-05-18 13:09 hopeshared
          你要做商業(yè)用途?

          這個(gè)類是美國(guó)一所大學(xué)的(挺出名,忘記是哪所了)一個(gè)項(xiàng)目中的一個(gè)jar附帶的,假如你只是自己做著玩應(yīng)該沒有問題,但是如果是商業(yè)用途,而且是大型的商業(yè)項(xiàng)目,需要查一下該jar所屬的lisence是不是能用,避免版權(quán)問題

          @bghtiaoliangxiaochou@hotmail.com
            回復(fù)  更多評(píng)論
            

          # re: 2005.6.12 圖片處理 2006-05-19 10:02 bghtiaoliangxiaochou@hotmail.com
          謝謝你的關(guān)注!
          但是怎么才能查到該jar的licence??
            回復(fù)  更多評(píng)論
            

          # re: 2005.6.12 圖片處理 2006-11-30 19:50 河風(fēng)
          正在關(guān)注這面資料。謝謝  回復(fù)  更多評(píng)論
            

          # re: 2005.6.12 圖片處理 2007-06-06 16:10 MTeamxg
          URL url= new URL("http://img.us.cyworld.com/image/main/beta_logo.gif");
          和樓上提的問題一樣的,試了半天,不知道怎么解決,幫幫我!謝謝!  回復(fù)  更多評(píng)論
            

          # re: 2005.6.12 圖片處理 2007-06-06 16:12 MTeamxg
          我的郵箱是:xugang_1231@hotmail.com  回復(fù)  更多評(píng)論
            

          # re: 2005.6.12 圖片處理 2007-06-06 16:45 MTeamxg
          哈哈,解決,謝謝摟主的帖子!!!頂  回復(fù)  更多評(píng)論
            

          # re: 2005.6.12 圖片處理[未登錄] 2008-05-31 11:44 風(fēng)子
          謝謝,傳一份給我啊,我的郵箱:zenghouhuang21@163.com  回復(fù)  更多評(píng)論
            

          # re: 2005.6.12 圖片處理 2013-06-24 15:10 luoweikongjian
          樓主能否給我傳一份openmap.jar包,謝謝,我的郵箱是qiaoyuan1986@163.com  回復(fù)  更多評(píng)論
            

          # re: 2005.6.12 圖片處理 2013-06-24 15:12 luoweikongjian
          @hopeshared
          沒載下載,麻煩給我傳一份,我的郵箱地址是qiaoyuan1986@163.com  回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 慈溪市| 中山市| 水富县| 保山市| 邢台县| 公主岭市| 临桂县| 许昌市| 济南市| 天柱县| 博白县| 海安县| 娄烦县| 巫山县| 聊城市| 军事| 渭南市| 嫩江县| 新营市| 肥西县| 桃园县| 灵璧县| 淅川县| 凤翔县| 印江| 光泽县| 汝城县| 德阳市| 海南省| 安庆市| 田林县| 三穗县| 河池市| 弥勒县| 垫江县| 北流市| 海门市| 睢宁县| 云林县| 衡东县| 武平县|