java壓縮圖片記憶體大小,但不改變解析度大小,第一種方式
* @Title: compressPicByQuality
* @Description: 壓縮圖片,通過壓縮圖片質量,保持原圖大小
* @param quality:0-1
* @return byte[]
* @throws
*/
public static byte[] compressPicByQuality(byte[] imgByte, float quality) {
byte[] inByte = null;
try {
ByteArrayInputStream byteInput = new ByteArrayInputStream(imgByte);
BufferedImage image = ImageIO.read(byteInput);
// 如果圖片空,返回空
if (image == null) {
return null;
}
// 得到指定Format圖片的writer
Iterator<ImageWriter> iter = ImageIO
.getImageWritersByFormatName("jpeg");// 得到迭代器
ImageWriter writer = (ImageWriter) iter.next(); // 得到writer
// 得到指定writer的輸出引數設定(ImageWriteParam )
ImageWriteParam iwp = writer.getDefaultWriteParam();
iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); // 設定可否壓縮
iwp.setCompressionQuality(quality); // 設定壓縮質量引數
iwp.setProgressiveMode(ImageWriteParam.MODE_DISABLED);
ColorModel colorModel = ColorModel.getRGBdefault();
// 指定壓縮時使用的色彩模式
iwp.setDestinationType(new javax.imageio.ImageTypeSpecifier(colorModel,
colorModel.createCompatibleSampleModel(16, 16)));
// 開始打包圖片,寫入byte[]
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); // 取得記憶體輸出流
IIOImage iIamge = new IIOImage(image, null, null);
// 此處因為ImageWriter中用來接收write資訊的output要求必須是ImageOutput
// 通過ImageIo中的靜態方法,得到byteArrayOutputStream的ImageOutput
writer.setOutput(ImageIO
.createImageOutputStream(byteArrayOutputStream));
writer.write(null, iIamge, iwp);
inByte = byteArrayOutputStream.toByteArray();
} catch (IOException e) {
System.out.println("write errro");
e.printStackTrace();
}
return inByte;
}