java thumbnails 内存_Java修改图片尺寸,总是报内存溢出怎么解决?
项目需求:有很多尺寸很大的图片(图片大小可能几十MB,甚至上百MB),需要等比例缩小它们的尺寸,相当于生成缩略图。例如:原图8268x6201,需要压缩成400x300。我现在的方法:将图片整个读入内存,然后修改宽、高,最后写回磁盘。核心代码大概这样:BufferedImage oldImg = ImageIO.read(in);BufferedImage newImg = new Buffere
项目需求:有很多尺寸很大的图片(图片大小可能几十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.
尝试:
我试过增大分配给JVM的内存,但是效果不明显。首先机器内存有限,不可能无限增加。而且图片的大小没有上限,所以此方法不能很好地解决问题。
理想的情况,应该是通过一种“流式的算法”,一边把原始图片从磁盘读到内存,一边修改尺寸,一边写到磁盘生成目标图片。这种算法理论上只需要常数级内存空间。不过我在网上找了很久也没有找到。
我对图形学、图片格式、图片处理相关的知识不熟悉,不知道是否存在这样的算法,以及Java是否支持这样的算法。在此请教大家。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)