图片压缩工具类
前言
在 java图片编码解码_伟衙内的博客-CSDN博客 中,将图片变成byte[] 数组,有时候接受到的图片过大,这样就需要将图片压缩后传输,节省时间。
但是压缩后的图片会失真,这个就看项目对图片要求了。
代码
/**
* 压缩图片(通过降低图片质量)
* @explain 压缩图片,通过压缩图片质量,保持原图大小
* @param quality
* 图片质量(0-1)
* @return byte[]
* 压缩后的图片(jpg)
* @throws
*/
public static byte[] compressPicByQuality(byte[] imgByte, float quality) {
byte[] retBytes = imgByte;
try {
ByteArrayInputStream byteInput = new ByteArrayInputStream(imgByte);
BufferedImage image = ImageIO.read(byteInput);
// 如果图片空,返回空
if (image == null) {
return retBytes;
}
// 得到指定Format图片的writer(迭代器)
Iterator<ImageWriter> iter = ImageIO.getImageWritersByFormatName("jpeg");
// 得到writer
ImageWriter writer = (ImageWriter) iter.next();
// 得到指定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);
retBytes = byteArrayOutputStream.toByteArray();
} catch (IOException e) {
e.printStackTrace();
}
return retBytes;
}
使用时可以判断图片的大小,如果图片太小其实可以不用压缩的,
byte[] photo = XXXX;
if(photo.length>80000){//8W的大小保存到数据库应该是60KB,超过这个就压缩
photo = ImgUtils.compressPicByQuality(photo,0.1F);
}