<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 495,comments - 227,trackbacks - 0

       過去做的項目都是針對企業(yè)級應用,第一次開發(fā)新聞版塊圖片上傳的功能,需要解決用戶上傳圖片后,按照用戶規(guī)定的尺寸大小或者按照圖片比例,對圖片進行壓縮。

    之前做過圖片壓縮處理,不過使用的是一個組件,這個組件需要在服務器上進行安裝,很不方便。組件的下載地址是:

    http://www.imagemagick.org/download/binaries/ImageMagick-6.2.9-4-Q16-windows-dll.exe

        自己試寫的工具類,寫的時候考慮了幾個關鍵點:

        1、圖片格式

        JAVA的API很好,com.sun.image.codec.jpeg.JPEGCodec和com.sun.image.codec.jpeg.JPEGImageEncoder 這兩個類基本上自動解決了類型轉(zhuǎn)換的問題,可以正常實現(xiàn)bmp轉(zhuǎn)jpg、png轉(zhuǎn)jpg、gif轉(zhuǎn)jpg,但是暫時還沒有解決gif轉(zhuǎn)gif的功能。

        2、畫面質(zhì)量的問題

        BufferedImage tag = new BufferedImage((int)newWidth, (int) newHeight, BufferedImage.TYPE_INT_RGB);

        // Image.SCALE_SMOOTH 的縮略算法 生成縮略圖片的平滑度的 優(yōu)先級比速度高 生成的圖片質(zhì)量比較好 但速度慢

        tag.getGraphics().drawImage(img.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH), 0, 0, null);

        3、壓縮速度

        測試36MB的bmp圖片(8192*6144)壓縮成(160*120)的jpg的5KB圖片,只需要2-3秒的時間。批量處理100張(1027*768)的bmp圖像,轉(zhuǎn)換成(120*80)的jpg圖片總共只需要17秒。

        4、根據(jù)用戶喜好選擇壓縮模式

        按比例或者按規(guī)定尺寸

        //compressPic(大圖片路徑,生成小圖片路徑,大圖片文件名,生成小圖片文名,生成小圖片寬度,生成小圖片高度,是否等比縮放(默認為true))

     

        以下是源碼,如覺得可以更加完善的話,希望大家可以提供點意見!!

    /**
     *  縮略圖實現(xiàn),將圖片(jpg、bmp、png、gif等等)真實的變成想要的大小
     
    */
    package com.joewalker.test;

    import java.awt.Image;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import javax.imageio.ImageIO;
    import com.sun.image.codec.jpeg.JPEGCodec;
    import com.sun.image.codec.jpeg.JPEGImageEncoder;

    /*******************************************************************************
     * 縮略圖類(通用) 本java類能將jpg、bmp、png、gif圖片文件,進行等比或非等比的大小轉(zhuǎn)換。 具體使用方法
     * compressPic(大圖片路徑,生成小圖片路徑,大圖片文件名,生成小圖片文名,生成小圖片寬度,生成小圖片高度,是否等比縮放(默認為true))
     
    */
     
    public class CompressPicDemo { 
         
    private File file = null// 文件對象 
         private String inputDir; // 輸入圖路徑
         private String outputDir; // 輸出圖路徑
         private String inputFileName; // 輸入圖文件名
         private String outputFileName; // 輸出圖文件名
         private int outputWidth = 100// 默認輸出圖片寬
         private int outputHeight = 100// 默認輸出圖片高
         private boolean proportion = true// 是否等比縮放標記(默認為等比縮放)
         public CompressPicDemo() { // 初始化變量
             inputDir = ""
             outputDir 
    = ""
             inputFileName 
    = ""
             outputFileName 
    = ""
             outputWidth 
    = 100
             outputHeight 
    = 100
         } 
         
    public void setInputDir(String inputDir) { 
             
    this.inputDir = inputDir; 
         } 
         
    public void setOutputDir(String outputDir) { 
             
    this.outputDir = outputDir; 
         } 
         
    public void setInputFileName(String inputFileName) { 
             
    this.inputFileName = inputFileName;
         } 
         
    public void setOutputFileName(String outputFileName) { 
             
    this.outputFileName = outputFileName; 
         } 
         
    public void setOutputWidth(int outputWidth) {
             
    this.outputWidth = outputWidth; 
         } 
         
    public void setOutputHeight(int outputHeight) { 
             
    this.outputHeight = outputHeight; 
         } 
         
    public void setWidthAndHeight(int width, int height) { 
             
    this.outputWidth = width;
             
    this.outputHeight = height; 
         } 
         
         
    /* 
          * 獲得圖片大小 
          * 傳入?yún)?shù) String path :圖片路徑 
          
    */ 
         
    public long getPicSize(String path) { 
             file 
    = new File(path); 
             
    return file.length(); 
         }
         
         
    // 圖片處理 
         public String compressPic() { 
             
    try { 
                 
    //獲得源文件 
                 file = new File(inputDir + inputFileName); 
                 
    if (!file.exists()) { 
                     
    return ""
                 } 
                 Image img 
    = ImageIO.read(file); 
                 
    // 判斷圖片格式是否正確 
                 if (img.getWidth(null== -1) {
                     System.out.println(
    " can't read,retry!" + "<BR>"); 
                     
    return "no"
                 } 
    else { 
                     
    int newWidth; int newHeight; 
                     
    // 判斷是否是等比縮放 
                     if (this.proportion == true) { 
                         
    // 為等比縮放計算輸出的圖片寬度及高度 
                         double rate1 = ((double) img.getWidth(null)) / (double) outputWidth + 0.1
                         
    double rate2 = ((double) img.getHeight(null)) / (double) outputHeight + 0.1
                         
    // 根據(jù)縮放比率大的進行縮放控制 
                         double rate = rate1 > rate2 ? rate1 : rate2; 
                         newWidth 
    = (int) (((double) img.getWidth(null)) / rate); 
                         newHeight 
    = (int) (((double) img.getHeight(null)) / rate); 
                     } 
    else { 
                         newWidth 
    = outputWidth; // 輸出的圖片寬度 
                         newHeight = outputHeight; // 輸出的圖片高度 
                     } 
                     BufferedImage tag 
    = new BufferedImage((int) newWidth, (int) newHeight, BufferedImage.TYPE_INT_RGB); 
                     
                     
    /*
                     * Image.SCALE_SMOOTH 的縮略算法 生成縮略圖片的平滑度的
                     * 優(yōu)先級比速度高 生成的圖片質(zhì)量比較好 但速度慢
                     
    */ 
                     tag.getGraphics().drawImage(img.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH), 
    00null);
                     FileOutputStream out 
    = new FileOutputStream(outputDir + outputFileName);
                     
    // JPEGImageEncoder可適用于其他圖片類型的轉(zhuǎn)換 
                     JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); 
                     encoder.encode(tag); 
                     out.close(); 
                 } 
             } 
    catch (IOException ex) { 
                 ex.printStackTrace(); 
             } 
             
    return "ok"
        } 
         
    public String compressPic (String inputDir, String outputDir, String inputFileName, String outputFileName) { 
             
    // 輸入圖路徑 
             this.inputDir = inputDir; 
             
    // 輸出圖路徑 
             this.outputDir = outputDir; 
             
    // 輸入圖文件名 
             this.inputFileName = inputFileName; 
             
    // 輸出圖文件名
             this.outputFileName = outputFileName; 
             
    return compressPic(); 
         } 
         
    public String compressPic(String inputDir, String outputDir, String inputFileName, String outputFileName, int width, int height, boolean gp) { 
             
    // 輸入圖路徑 
             this.inputDir = inputDir; 
             
    // 輸出圖路徑 
             this.outputDir = outputDir; 
             
    // 輸入圖文件名 
             this.inputFileName = inputFileName; 
             
    // 輸出圖文件名 
             this.outputFileName = outputFileName; 
             
    // 設置圖片長寬
             setWidthAndHeight(width, height); 
             
    // 是否是等比縮放 標記 
             this.proportion = gp; 
             
    return compressPic(); 
         } 
         
         
    // main測試 
         
    // compressPic(大圖片路徑,生成小圖片路徑,大圖片文件名,生成小圖片文名,生成小圖片寬度,生成小圖片高度,是否等比縮放(默認為true))
         public static void main(String[] arg) { 
             CompressPicDemo mypic 
    = new CompressPicDemo(); 
             System.out.println(
    "輸入的圖片大?。?/span>" + mypic.getPicSize("e:\\1.jpg")/1024 + "KB"); 
             
    int count = 0// 記錄全部圖片壓縮所用時間
             for (int i = 0; i < 100; i++) { 
                 
    int start = (int) System.currentTimeMillis();    // 開始時間 
                 mypic.compressPic("e:\\""e:\\test\\""1.jpg""r1"+i+".jpg"120120true); 
                 
    int end = (int) System.currentTimeMillis(); // 結束時間 
                 int re = end-start; // 但圖片生成處理時間 
                 count += re; System.out.println("" + (i+1+ "張圖片壓縮處理使用了: " + re + "毫秒"); 
                 System.out.println(
    "輸出的圖片大小:" + mypic.getPicSize("e:\\test\\r1"+i+".jpg")/1024 + "KB"); 
             }
             System.out.println(
    "總共用了:" + count + "毫秒"); 
         } 
     }


    posted on 2009-08-21 12:02 SIMONE 閱讀(9452) 評論(4)  編輯  收藏 所屬分類: JAVA

    FeedBack:
    # re: 圖片上傳壓縮處理(可以正常實現(xiàn)bmp轉(zhuǎn)jpg、png轉(zhuǎn)jpg、gif轉(zhuǎn)jpg,但是暫時還沒有解決gif轉(zhuǎn)gif的功能)
    2010-07-30 09:42 | 唐曉明 t
    您好:請問,如果是c++ 程序如何解決 圖片上傳和壓縮的問題啊,這個是我的郵箱方便告訴我嗎?我為這個問題搞了好長時間了,謝謝您了Towusan.tang@pantrateq.com  回復  更多評論
      
    # re: 圖片上傳壓縮處理(可以正常實現(xiàn)bmp轉(zhuǎn)jpg、png轉(zhuǎn)jpg、gif轉(zhuǎn)jpg,但是暫時還沒有解決gif轉(zhuǎn)gif的功能)
    2010-09-19 07:25 | 紐斯麗
    不錯多謝   回復  更多評論
      
    # re: 圖片上傳壓縮處理(可以正常實現(xiàn)bmp轉(zhuǎn)jpg、png轉(zhuǎn)jpg、gif轉(zhuǎn)jpg,但是暫時還沒有解決gif轉(zhuǎn)gif的功能)[未登錄]
    2011-06-02 16:17 | 你好
    這是java處理代碼,如果jsp得input 標簽 type="file"要上傳圖片,Servlet如何獲得這個圖片的路徑呢?只有file里的完整路徑,才可以進行下一步的讀取啊。  回復  更多評論
      
    # re: 圖片上傳壓縮處理(可以正常實現(xiàn)bmp轉(zhuǎn)jpg、png轉(zhuǎn)jpg、gif轉(zhuǎn)jpg,但是暫時還沒有解決gif轉(zhuǎn)gif的功能)
    2012-07-05 15:30 | 小邢
    麻煩您把這個改寫成javascript格式的好嗎?  回復  更多評論
      
    主站蜘蛛池模板: 亚洲成年轻人电影网站www| 亚洲av日韩av永久在线观看| 青青草免费在线视频| 亚洲成av人在线观看网站| 国产亚洲精品a在线观看| 免费A级毛片无码专区| 亚洲性无码一区二区三区| 亚洲午夜无码AV毛片久久| 国产一卡二卡四卡免费| 一级日本高清视频免费观看 | 91精品免费久久久久久久久| 亚洲日本成本人观看| 久久亚洲精品视频| 在线观看亚洲免费视频| 久久午夜伦鲁片免费无码| 亚洲A∨精品一区二区三区下载| 亚洲av日韩av不卡在线观看| 国产免费爽爽视频免费可以看| 9420免费高清在线视频| 一级做a免费视频观看网站| 日韩亚洲产在线观看| 亚洲国产三级在线观看| 国产成人免费片在线视频观看| 久久久精品2019免费观看 | 亚洲成人免费电影| 亚洲一区二区三区无码影院| 免费A级毛片无码免费视| 美女内射无套日韩免费播放| 又硬又粗又长又爽免费看| 99亚偷拍自图区亚洲| 中文字幕亚洲综合久久| 中文字幕在线亚洲精品| 又黄又爽的视频免费看| 在线免费观看一级毛片| 国产乱子精品免费视观看片| 国产午夜精品免费一区二区三区 | 在线观看日本免费a∨视频| 午夜免费福利视频| 中文字幕乱码系列免费| 日本高清免费中文在线看| 亚洲AV无码专区亚洲AV桃|