1. 程式人生 > >java學習筆記(中級篇)—java實現高質量圖片壓縮

java學習筆記(中級篇)—java實現高質量圖片壓縮

使用java幾十行程式碼實現一個高質量圖片壓縮程式,再也不用去自己找網路的壓縮程式啦!而且很多網上的工具還有水印或者其他的限制,自己動手寫一個簡單的應用,是再合適不過了。

一、實現原理

1、宣告兩個字串變數,分別是要壓縮圖片的路徑和壓縮後圖片的存放路徑

private String brfore_image_path = "D:\\01.jpg";
private String after_image_path = "D:\\temp";

2、利用字串的方法lastIndexOf,找到\和.最後出現的位置,目的是匹配到圖片檔名。

int begin = brfore_image_path.lastIndexOf("\\");
int end = brfore_image_path.lastIndexOf(".");
String image_name=brfore_image_path.substring(begin+1,end);

3、建立BufferedImage物件來讀取需要壓縮的圖片

4、獲取原始圖片的一系列引數

int in_width  = bi.getWidth();//圖寬
int in_height = bi.getHeight();//圖高
int in_minx   = bi.getMinX();//BufferedImage的最小x
int in_miny   = bi.getMinY();//BufferedImage的最小y
int type = bi.getType();//返回影象型別
int out_width = in_width;//要輸出影象的寬
int out_height = in_height;//要輸出影象的高
int multiple = 1;//係數

5、壓縮核心程式碼,可自己除錯找最適合的臨界值,我選取的是大於1000000畫素點時就壓縮一半

while(out_width * out_height > 1000000){
    out_width = out_width/2;
    out_height = out_height/2;
    multiple = multiple * 2;
}   

6、建立新的BufferedImage物件,把新的引數傳進去,並根據係數把一個個畫素點寫進圖片。

for(int i=0;i<out_width;i++) {
    for(int j =0;j<out_height;j++) {      intpixel=bi.getRGB(i*multiple+in_minx,j*multiple+in_miny);
 ut_image_martrix.setRGB(i, j, pixel);
    }
}

7、把新的BufferedImage物件寫到你要儲存壓縮圖片的地址就好了。

二、完整程式碼

public class CompressImage {
    private String brfore_image_path = "D:\\01.jpg";
    private String after_image_path = "D:\\temp";
    
    public CompressImage(){
    }

    public void get_image(){
        int begin = brfore_image_path.lastIndexOf("\\");
        int end = brfore_image_path.lastIndexOf(".");
        String image_name = brfore_image_path.substring(begin+1,end);

        File in_file = new File(brfore_image_path);
        BufferedImage bi = null;
        try {
            bi = ImageIO.read(in_file);
        }catch(Exception e) {
            e.printStackTrace();
        }
        int in_width  = bi.getWidth();
        int in_height = bi.getHeight();
        int in_minx   = bi.getMinX();
        int in_miny   = bi.getMinY();
        int type = bi.getType();
        int out_width = in_width;
        int out_height = in_height;
        int multiple = 1;
        
        //具體的值可調
        while(out_width * out_height > 1000000){
            out_width = out_width/2;
            out_height = out_height/2;
            multiple = multiple * 2;
        }   
        BufferedImage out_image_martrix = new            BufferedImage(out_width, out_height, type);
        for(int i=0;i<out_width;i++) {
            for(int j =0;j<out_height;j++) {
                int pixel =bi.getRGB(i*multiple+in_minx, j*multiple+in_miny);
                out_image_martrix.setRGB(i, j, pixel);
            }
        }
        try{
            after_image_path = after_image_path + image_name + ".jpg";
            ImageIO.write(out_image_martrix,"jpg", new File(new_path));
            bi = null;
            out_image_martrix = null;
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    
    //測試程式碼
    public static void main(String[] args) {
        new CompressImage().get_image();
    }
}

三、總結

程式碼挺簡單的,但是自己動手實現完成一個小功能也不一樣哦,而且我覺得壓縮的質量還挺高的,所以把自己的實現思路和程式碼分享出來。有興趣的童鞋可以自己複製上面的完整程式碼,只要改成自己的路徑就可以運行了。當然啦,幾行程式碼無法媲美專業的壓縮工具