java學習筆記(中級篇)—java實現高質量圖片壓縮
阿新 • • 發佈:2019-08-05
使用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();
}
}
三、總結
程式碼挺簡單的,但是自己動手實現完成一個小功能也不一樣哦,而且我覺得壓縮的質量還挺高的,所以把自己的實現思路和程式碼分享出來。有興趣的童鞋可以自己複製上面的完整程式碼,只要改成自己的路徑就可以運行了。當然啦,幾行程式碼無法媲美專業的壓縮工具