为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕田峪7331174 2019-03-12 09:19:31
项目需求:有很多尺寸很大的图片(图片大小可能几十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是否支持这样的算法。在此请教大家。
查看完整描述

5 回答

?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

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


查看完整回答
反对 回复 2019-04-25
?
慕森王

TA贡献1777条经验 获得超3个赞

可以试试 ImageMagick


查看完整回答
反对 回复 2019-04-25
?
青春有我

TA贡献1784条经验 获得超8个赞

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


查看完整回答
反对 回复 2019-04-25
  • 5 回答
  • 0 关注
  • 1381 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号