整理文檔,搜刮出一個Java做圖片壓縮的代碼,稍微整理精簡一下做下分享。
首先,要壓縮的圖片格式不能說動態圖片,你可以使用bmp、png、gif等,至于壓縮質量,可以通過BufferedImage來指定。
在C盤的temp下放置一張圖片pic123.jpg,盡量找一個像素高一點的圖片,這里我找了一張5616*3744的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
package test; import java.io.*; import java.util.Date; import java.awt.*; import java.awt.image.*; import javax.imageio.ImageIO; import com.sun.image.codec.jpeg.*; /** * 圖片壓縮處理 * @author 崔素強 */ public class ImgCompress { private Image img; private int width; private int height; @SuppressWarnings ( "deprecation" ) public static void main(String[] args) throws Exception { System.out.println( "開始:" + new Date().toLocaleString()); ImgCompress imgCom = new ImgCompress( "C:\\temp\\pic123.jpg" ); imgCom.resizeFix( 400 , 400 ); System.out.println( "結束:" + new Date().toLocaleString()); } /** * 構造函數 */ public ImgCompress(String fileName) throws IOException { File file = new File(fileName); // 讀入文件 img = ImageIO.read(file); // 構造Image對象 width = img.getWidth( null ); // 得到源圖寬 height = img.getHeight( null ); // 得到源圖長 } /** * 按照寬度還是高度進行壓縮 * @param w int 最大寬度 * @param h int 最大高度 */ public void resizeFix( int w, int h) throws IOException { if (width / height > w / h) { resizeByWidth(w); } else { resizeByHeight(h); } } /** * 以寬度為基準,等比例放縮圖片 * @param w int 新寬度 */ public void resizeByWidth( int w) throws IOException { int h = ( int ) (height * w / width); resize(w, h); } /** * 以高度為基準,等比例縮放圖片 * @param h int 新高度 */ public void resizeByHeight( int h) throws IOException { int w = ( int ) (width * h / height); resize(w, h); } /** * 強制壓縮/放大圖片到固定的大小 * @param w int 新寬度 * @param h int 新高度 */ public void resize( int w, int h) throws IOException { // SCALE_SMOOTH 的縮略算法 生成縮略圖片的平滑度的 優先級比速度高 生成的圖片質量比較好 但速度慢 BufferedImage image = new BufferedImage(w, h,BufferedImage.TYPE_INT_RGB ); image.getGraphics().drawImage(img, 0 , 0 , w, h, null ); // 繪制縮小后的圖 File destFile = new File( "C:\\temp\\456.jpg" ); FileOutputStream out = new FileOutputStream(destFile); // 輸出到文件流 // 可以正常實現bmp、png、gif轉jpg JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); encoder.encode(image); // JPEG編碼 out.close(); } } |
運行后在C盤temp下生成一個465.jpg,像素大小為600*400,像素大小是我指定的。用時也就是一兩秒的事情,注意,我這張圖片是10M的,壓縮后是40.5KB。
一些細節事項可以參考代碼中的注釋。
要注意的是,你可能想試一試較大圖片的處理能力,如果你的JDK沒有指定默認內存,那可能會有如下異常,因為內存不夠大:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
開始: 2014 - 4 - 14 16 : 25 : 11 Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.awt.image.DataBufferByte.<init>(DataBufferByte.java: 58 ) at java.awt.image.ComponentSampleModel.createDataBuffer(ComponentSampleModel.java: 397 ) at java.awt.image.Raster.createWritableRaster(Raster.java: 938 ) at javax.imageio.ImageTypeSpecifier.createBufferedImage(ImageTypeSpecifier.java: 1169 ) at javax.imageio.ImageReader.getDestination(ImageReader.java: 2879 ) at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(JPEGImageReader.java: 943 ) at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(JPEGImageReader.java: 915 ) at javax.imageio.ImageIO.read(ImageIO.java: 1422 ) at javax.imageio.ImageIO.read(ImageIO.java: 1282 ) at test.ImgCompress.<init>(ImgCompress.java: 31 ) at test.ImgCompress.main(ImgCompress.java: 21 ) |
解決方法:
在Eclipse里選:Window->Preference->Installed JREs->Edit(選中jre),
在Default VM Arguments里輸入-Xms256m -Xmx1024m,表示最小內存256M,最大1G,然后運行就可以了
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:http://cuisuqiang.iteye.com/blog/2045855