帮我用java写个图片压缩方法,要求对内存使用最低,避免内存泄漏,及时释放内存
时间: 2024-03-09 16:48:02 浏览: 67
好的,以下是一个简单的Java图片压缩方法,它使用了Java标准库中的ImageIO类来读取和压缩图片。
```java
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.imageio.ImageIO;
public class ImageCompressor {
public static byte[] compressImage(InputStream inputStream, int quality) throws IOException {
BufferedImage originalImage = ImageIO.read(inputStream);
int width = originalImage.getWidth();
int height = originalImage.getHeight();
// 计算压缩比例
float compressRatio = quality / 100f;
// 计算压缩后图片大小
int compressedImageSize = (int) (inputStream.available() * compressRatio);
// 创建压缩后的图片缓冲区
BufferedImage compressedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g = compressedImage.createGraphics();
// 设置渲染质量
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
// 绘制压缩后的图片
g.drawImage(originalImage, 0, 0, width, height, null);
g.dispose();
// 创建字节数组输出流
ByteArrayOutputStream out = new ByteArrayOutputStream();
// 将压缩后的图片写入字节数组输出流
ImageIO.write(compressedImage, "jpg", out);
// 将压缩后的图片字节数组转换为字节数组
byte[] compressedImageBytes = out.toByteArray();
// 判断压缩后图片大小是否小于原图大小,如果是则返回压缩后图片,否则返回原图
if (compressedImageBytes.length < compressedImageSize) {
return compressedImageBytes;
} else {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, len);
}
return outputStream.toByteArray();
}
}
}
```
这个方法接受一个InputStream对象和一个质量参数,质量参数越高,图片质量越好,压缩比例越小。方法首先使用ImageIO类的read方法读取输入流中的图片,然后计算压缩比例,再根据压缩比例计算出压缩后图片的大小。接着创建一个缓冲区用于存储压缩后的图片,并使用Graphics2D类的drawImage方法将原图绘制为压缩后的图片。然后将压缩后的图片字节数组写入一个ByteArrayOutputStream对象中。最后,方法判断压缩后图片大小是否小于原图大小,如果是则返回压缩后图片的字节数组,否则返回原图的字节数组。这个方法使用的内存非常少,因为它只读取一个输入流,并且在压缩完成后立即释放了内存。
阅读全文