帮我用java写个图片压缩到200kb的方法,要求对内存使用最低,避免内存泄漏,及时释放内存,支持多图片格式,入参为base64回参为base64
时间: 2024-03-09 10:48:28 浏览: 72
好的,这里是一个Java方法,可以将Base64编码的图片压缩到200KB以下,并返回压缩后的Base64编码图片:
```java
public static String compressImage(String base64Image) throws IOException {
byte[] imageBytes = Base64.getDecoder().decode(base64Image);
BufferedImage image = ImageIO.read(new ByteArrayInputStream(imageBytes));
ByteArrayOutputStream out = new ByteArrayOutputStream();
float quality = 1.0f;
while (true) {
ImageWriter writer = ImageIO.getImageWritersByFormatName(getImageFormat(image)).next();
ImageWriteParam param = writer.getDefaultWriteParam();
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionQuality(quality);
writer.setOutput(new MemoryCacheImageOutputStream(out));
writer.write(null, new IIOImage(image, null, null), param);
writer.dispose();
quality -= 0.05f;
if (out.size() <= 200 * 1024) {
break;
}
out.reset();
}
byte[] compressedBytes = out.toByteArray();
out.close();
return Base64.getEncoder().encodeToString(compressedBytes);
}
private static String getImageFormat(BufferedImage image) {
String formatName = "jpg";
if (image != null) {
switch (image.getType()) {
case BufferedImage.TYPE_INT_RGB:
case BufferedImage.TYPE_INT_ARGB:
formatName = "png";
break;
case BufferedImage.TYPE_INT_BGR:
formatName = "bmp";
break;
case BufferedImage.TYPE_BYTE_GRAY:
case BufferedImage.TYPE_USHORT_GRAY:
formatName = "gif";
break;
default:
break;
}
}
return formatName;
}
```
这个方法接收一个Base64编码的图片字符串作为参数,并返回压缩后的Base64编码图片字符串。
在方法内部,我们首先将Base64编码的图片字符串解码为字节数组,并使用ImageIO.read方法将图片读入内存中。然后我们通过逐步降低压缩质量的方式,将图片压缩到200KB以内。在压缩过程中,我们使用了Java内存缓存图像输出流来避免内存泄漏和高内存占用。最后,将压缩后的图片数据转换为Base64编码字符串,并返回给调用者。
需要注意的是,这个方法支持压缩jpg、png、bmp、gif等常见图片格式,可以根据实际情况修改getImageFormat方法中的逻辑。
阅读全文