問題背景。
典型的情景:Nemo社區(qū)中,用戶上傳的圖片免不了要在某處給用戶做展示。
如用戶上傳的頭像,那么其他用戶在瀏覽該用戶信息的時候,就會需要回顯頭像信息了。
用戶上傳的原圖可能由于清晰度較高而體積也相對較大,考慮用戶流量帶寬,一般而言我們都不會直接體積巨大的原圖直接丟給用戶讓用戶慢慢下載。
這時候通常我們會在服務(wù)器對圖片進行壓縮,然后把壓縮后的圖片內(nèi)容回顯給用戶。
壓縮方案:
這里主要找了兩個java中常用的圖片壓縮工具庫:Graphics和Thumbnailator。
1、Graphics:
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
|
/** * compressImage * * @param imageByte * Image source array * @param ppi * @return */ public static byte [] compressImage( byte [] imageByte, int ppi) { byte [] smallImage = null ; int width = 0 , height = 0 ; if (imageByte == null ) return null ; ByteArrayInputStream byteInput = new ByteArrayInputStream(imageByte); try { Image image = ImageIO.read(byteInput); int w = image.getWidth( null ); int h = image.getHeight( null ); // adjust weight and height to avoid image distortion double scale = 0 ; scale = Math.min(( float ) ppi / w, ( float ) ppi / h); width = ( int ) (w * scale); width -= width % 4 ; height = ( int ) (h * scale); if (scale >= ( double ) 1 ) return imageByte; BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); buffImg.getGraphics().drawImage(image.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0 , 0 , null ); ByteArrayOutputStream out = new ByteArrayOutputStream(); ImageIO.write(buffImg, "png" , out); smallImage = out.toByteArray(); return smallImage; } catch (IOException e) { log.error(e.getMessage()); throw new RSServerInternalException( "" ); } } |
重點在于:
1
2
|
BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); buffImg.getGraphics().drawImage(image.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0 , 0 , null ); |
2、Thumbnailator:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
/** * compressImage * * @param path * @param ppi * @return */ public static byte [] compressImage(String path, int ppi) { byte [] smallImage = null ; try { ByteArrayOutputStream out = new ByteArrayOutputStream(); Thumbnails.of(path).size(ppi, ppi).outputFormat( "png" ).toOutputStream(out); smallImage = out.toByteArray(); return smallImage; } catch (IOException e) { log.error(e.getMessage()); throw new RSServerInternalException( "" ); } } |
實際測試中,批量的情境下,后者較前者更快一些。
以上就是Java 實現(xiàn)圖片壓縮的兩種方法的詳細(xì)內(nèi)容,更多關(guān)于Java 圖片壓縮的資料請關(guān)注服務(wù)器之家其它相關(guān)文章!
原文鏈接:https://www.link-nemo.com/u/10001/post/227553