Java修改图片尺寸,总是报内存溢出怎么解决?

发布于 2022-09-03 19:29:59 字数 872 浏览 20 评论 0

项目需求:有很多尺寸很大的图片(图片大小可能几十MB,甚至上百MB),需要等比例缩小它们的尺寸,相当于生成缩略图。

例如:原图8268x6201,需要压缩成400x300。

我现在的方法:将图片整个读入内存,然后修改宽、高,最后写回磁盘。

核心代码大概这样:

BufferedImage oldImg = ImageIO.read(in);
BufferedImage newImg = new BufferedImage(400, 300, BufferedImage.TYPE_INT_RGB);
Graphs2D g = newImg.createGraphics();
g.drawImage(oldImg, 0, 0, 400, 300, null);
g.dispose();
ImageIO.write(newImg, 'jpg', new BufferedStream(out));

但是由于图片本身很大,而且可能会同时有多个线程在转,所以频繁发生内存溢出,报错:

java.lang.OutOfMemoryError: Java heap space.

尝试:

  1. 我试过增大分配给JVM的内存,但是效果不明显。首先机器内存有限,不可能无限增加。而且图片的大小没有上限,所以此方法不能很好地解决问题。

  2. 理想的情况,应该是通过一种“流式的算法”,一边把原始图片从磁盘读到内存,一边修改尺寸,一边写到磁盘生成目标图片。这种算法理论上只需要常数级内存空间。不过我在网上找了很久也没有找到。

我对图形学、图片格式、图片处理相关的知识不熟悉,不知道是否存在这样的算法,以及Java是否支持这样的算法。在此请教大家。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

极致的悲 2022-09-10 19:29:59

GraphicsMagick+im4java可以处理,GraphicsMagick不用把整张图片读取到内存中,比你用原生的效率高多了,你可以搜索看看,以前我们就是用GraphicsMagick处理图片裁剪的

酒绊 2022-09-10 19:29:59

可以试试 ImageMagick

旧人 2022-09-10 19:29:59

你可以试一下,我也不确定行不行

int w = 400;
int h = 300;
BufferedImage oldImg = ImageIO.read(new File("F:\\sample.jpg"));
Image t = oldImg.getScaledInstance(w, h, Image.SCALE_FAST);
BufferedImage newImg = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
Graphics2D g = newImg.createGraphics();
g.drawImage(t, 0, 0, w, h, null);
g.dispose();
ImageIO.write(newImg, "jpg", new File("F:\\small.jpg"));
情定在深秋 2022-09-10 19:29:59
    File srcFile = new File(srcImgPath);  
    Image srcImg = ImageIO.read(srcFile);  
    BufferedImage buffImg = null;  
    buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);  
    buffImg.getGraphics().drawImage(  
            srcImg.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0,  
            0, null);  

    ImageIO.write(buffImg, "JPEG", new File(distImgPath));  
荒人说梦 2022-09-10 19:29:59

思路可以换一换,显然内存中是能存储压缩后的图像的,而大图像应该应该读一部分处理后放到压缩后的图形中,总得来说这个问题不算难,思路换一下就行了

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文