前段时间,写了篇Java文字水印处理,实际运用过程中发现经常会报内存溢出错误,发现是在创建BufferedImage时报的错误。
水印处理最基本实现就是:
1)创建BufferedImage,在BufferedImage绘制原始图像,绘制文字;
2)根据BufferedImage生成物理的image file;
这里,尤其注意的是创建BufferedImage的时候,代码如下:
BufferedImage bimage = new BufferedImage(原始图片宽度, 原始图片高度,
BufferedImage.TYPE_INT_RGB);
宽度、高度单位都是像素;
在程序处理一张大小为3537*5017的图像的时候,程序报错,内存溢出。发现是在构建BufferedImage的时候出的错,这令我很惊奇。
据我所知3537*5017的rgb模式图像的数据量为:
3537*5017*3/1024/1024 =
假设,有一张图像大小为3537*5017的图像,则构建后的BufferedImage所需要的内存大概为:
3537*5017*3/1024/1024 = 50.8M
而我java虚拟机的最大内存是设置成2G的,很费解?????
由于,实际业务上传上来的图片只要打印成A4纸即可,因此只要把原始图片缩放即可,然后再缩放的图片上打印水印文字即可。这样,确实可以绕过刚才说的内存溢出问题。
但是有2点我还一直不是很明白:
1)BufferedImage构建的时候,其到底耗费多少内存,如何计算?
2)如果不用BufferedImage,有没有比较好的替代品?