JAVA 处理大图片(jpeg) 内存溢出的问题!100分

hengxxh hengxxh 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
简单的说,就是要实现这样一个功能:把一个大图片(3638*2736)的JPEG 图片加载进来,按比例缩小后输出!

在实现过程中,发现这样一个问题:在用 ImageIO.read(File input) 加载图片的时候,只要图片很大,就会报内存溢出;

在网上了解了一下,似乎都有这个问题,很多人推荐修改JVM的内存,但个人觉得这个方法也有不妥,因为我不知道我要处理的图片到底要多大,1M?5M?100M?

还有网友推荐,在用 ImageIO 的时候进行设置,如 ImageIO.setCacheDirectory(File cacheDirectory)给它设定一个缓存路径 或者 ImageIO.setUseCache(false)用系统缓存,这两个方法测试了,似乎没有用!

Toolkit 这个工具包里也有一个加载图片的方法,但是经过测试,这个方法加载的图片,在进行 JPEG 编码后,输出的图片是一个全黑的空图片。

File _file = new File("d:\\1.jpg"); //读入文件
Image src = javax.imageio.ImageIO.read(_file); //构造Image对象
int wideth=src.getWidth(null); //得到源图宽
int height=src.getHeight(null); //得到源图长
BufferedImage tag = new BufferedImage(wideth/2,height/2,BufferedImage.TYPE_INT_RGB);
tag.getGraphics().drawImage(src,0,0,wideth/2,height/2,null); //绘制缩小后的图
FileOutputStream out=new FileOutputStream("D:\\newfile.jpg"); //输出到文件流
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(tag); //近JPEG编码
out.close();


以上这个方法,在处理相对较小的图片,比如1M左右的图片,是可以的,但是如果 图片较大,在Image src = javax.imageio.ImageIO.read(_file); 就抛内存溢出;
如果这里的Image src 用 Toolkit来加载图片获得,在后面 进行 JPEG 编码后,输出的图片是全黑的空图片!


有没有好的解决办法,请有经验的高手指点下!谢谢!
...全文

相关推荐

java图片压缩处理(可以压缩为任意大小

java图片压缩处理(可以压缩为任意大小

wangfuqing2003

Java中上传图片压缩处理的方法示例

本篇文章主要介绍了Java中图片压缩处理的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

weixin_38739900

用java如何把图片处理到指定大小

用java如何把图片处理到指定大小 切割程序如下: public void cut(String srcImageFile,FileOutputStream fileout, int w, int h, int x1, int y1, int sw, int sh) { // TODO Auto-generated method stub try { // http://localhost:8080/ImpCra/createServlet?p=Sunset.jpg&x=117&y=201&w=61&h=50&pw=300&ph=400 Image img; ImageFilter cropFilter; // 读取源图像 BufferedImage bi = ImageIO.read(new File(srcImageFile)); if (sw >= w && sh >= h) { Image image = bi.getScaledInstance(sw, sh, Image.SCALE_DEFAULT); // 剪切起始坐标点 int x = x1; int y = y1; int destWidth = w; // 切片宽度 int destHeight = h; // 切片高度 // 图片比例 double pw = sw; double ph = sh; double m = (double) sw / pw; double n = (double) sh / ph; System.out.println(m); int wth = (int) (destWidth * m); int hth = (int) (destHeight * n); int xx = (int) (x * m); int yy = (int) (y * n); // 四个参数分别为图像起点坐标和宽高 // 即: CropImageFilter(int x,int y,int width,int height) cropFilter = new CropImageFilter(xx, yy, wth, hth); img = Toolkit.getDefaultToolkit().createImage( new FilteredImageSource(image.getSource(), cropFilter)); BufferedImage tag = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); Graphics g = tag.getGraphics(); g.drawImage(img, 0, 0, null); // 绘制缩小后的图 g.dispose(); // 输出为文件 ImageIO.write(tag, "JPEG", fileout); } } catch (Exception e) { e.printStackTrace(); } }

wangzhpwang

JAVA上传图片自动缩放处理.

JAVA上传图片自动缩放处理.,代码有注释,,可以直接运行测试

莫寻千百度

java 将内容,图片写到word中

一个使用java后台代码,生成word文档的小例子

小曹大人
评论 35
收藏 已收藏
分享
返回顶部
hengxxh
Java SE 62,621 成员 307,251 内容