隨筆 - 5  文章 - 2  trackbacks - 0
          <2006年11月>
          2930311234
          567891011
          12131415161718
          19202122232425
          262728293012
          3456789

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

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

          ?

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

          ????????
          //這里想實現在targetW,targetH范圍內實現等比縮放。如果不需要等比縮放
          ????????
          //則將下面的if?else語句注釋即可
          ????????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();
          ????}


          參數解釋:

          in ::是一個 jpg 圖片的 InputStream

          saveFile ::目標文件

          width ::目標寬度,如果不需要縮放則置 0

          hight ::目標高度,如果不需要縮放則置 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();
          ????}


          參數解釋:

          in::是一個jpg或者gif圖片的InputStream

          saveFile::目標文件

          width::目標寬度,如果不需要縮放則置0

          hight::目標高度,如果不需要縮放則置0

          ?

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

          ?

          ?

          Jpg圖片使用的是24-bit的編碼,pngpng-24png-8兩種,但是gif8-bit的編碼。如果強行將jpg圖片信息流按字節拆開,轉換成gif圖片,即使使用標準256色,也會出現嚴重的失真。

          ?

          我曾經使用了gif4j_light_trial_1.0.jar這個包,但是這個包讓我很失望。盡管它可以將多張圖片合成一個動態的gif圖片,但是它是付費的,免費使用期只有一個月。并且,在使用它將jpg圖片轉換成gif圖片之后中間會有一條白色的橫線,不知道這是系統的缺陷還是在費用包中做的手腳。

          posted on 2006-11-13 16:31 PrettyBoy 閱讀(2965) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 维西| 广东省| 都昌县| 亳州市| 河东区| 启东市| 黄冈市| 江安县| 武山县| 长白| 遂川县| 兰溪市| 泗水县| 新沂市| 南开区| 临沧市| 怀集县| 集安市| 秦安县| 泰州市| 康马县| 扎赉特旗| 阳春市| 闻喜县| 柳州市| 积石山| 武平县| 安塞县| 东光县| 南昌县| 咸宁市| 平谷区| 桦川县| 安溪县| 肥城市| 青冈县| 汉沽区| 克拉玛依市| 枞阳县| 凉山| 清涧县|