Java將圖片壓縮至指定大小
阿新 • • 發佈:2019-02-16
公司有業務,需要將部分圖片壓縮到指定大小以內才能上傳到某平臺。所以就學習了網上 各位大佬的圖片壓縮程式碼。寫了一個工具類,本著共同學習的態度,把程式碼貼一下,大家一起學習,一起進步。
工具類:
package com.yulong.app.util; import java.awt.Color; import java.awt.Graphics; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.Arrays; import javax.imageio.ImageIO; public class ImgTools { /** * 將圖片壓縮到指定大小以內 * * @param srcImgData 源圖片資料 * @param maxSize 目的圖片大小 * @return 壓縮後的圖片資料 */ public static byte[] compressUnderSize(byte[] srcImgData, long maxSize) { double scale = 0.9; byte[] imgData = Arrays.copyOf(srcImgData, srcImgData.length); if (imgData.length > maxSize) { do { try { imgData = compress(imgData, scale); } catch (IOException e) { throw new IllegalStateException("壓縮圖片過程中出錯,請及時聯絡管理員!", e); } } while (imgData.length > maxSize); } return imgData; } /** * 按照 寬高 比例壓縮 * * @param imgIs 待壓縮圖片輸入流 * @param scale 壓縮刻度 * @param out 輸出 * @return 壓縮後圖片資料 * @throws IOException 壓縮圖片過程中出錯 */ public static byte[] compress(byte[] srcImgData, double scale) throws IOException { BufferedImage bi = ImageIO.read(new ByteArrayInputStream(srcImgData)); int width = (int) (bi.getWidth() * scale); // 源圖寬度 int height = (int) (bi.getHeight() * scale); // 源圖高度 Image image = bi.getScaledInstance(width, height, Image.SCALE_SMOOTH); BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics g = tag.getGraphics(); g.setColor(Color.RED); g.drawImage(image, 0, 0, null); // 繪製處理後的圖 g.dispose(); ByteArrayOutputStream bOut = new ByteArrayOutputStream(); ImageIO.write(tag, "JPEG", bOut); return bOut.toByteArray(); } }
測試類:
package com.yulong.app.util; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.junit.Assert; import org.junit.Test; public class ImgToolsTest { @Test public void testCompressUnderSize() throws IOException { byte[] data = ImgTools.compressUnderSize(readInByteArray(new File("d:\\500467152.jpg")), 600 * 1024); Assert.assertTrue(data.length < 600 * 1024); FileUtils.writeByteArrayToFile(new File("d:\\compressed.jpg"), data); } private byte[] readInByteArray(File imgFile) { try { return IOUtils.toByteArray(new FileInputStream(imgFile)); } catch (IOException e) { throw new IllegalStateException("讀取待壓縮圖片過程中出錯,請及時聯絡管理員!", e); } } }
水平有限,歡迎指正。