前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >BufferedImage内存泄漏和溢出问题

BufferedImage内存泄漏和溢出问题

作者头像
翎野君
发布于 2024-05-04 01:18:55
发布于 2024-05-04 01:18:55
94900
代码可运行
举报
文章被收录于专栏:翎野君翎野君
运行总次数:0
代码可运行

java的ImageIO处理图片

在使用Thumbnailator时出现了OOM问题,但是其使用方法只有一行代码,无法针对其内部使用的对象进行资源释放,所以使用原生的Java类库中ImageIO来处理图片。 关键有三个类:ImageIO、BufferedImage、Graphics

  • ImageIO类包含两个静态方法:read()和write(),通过这两个方法即可完成对位图文件的读写,调用write()方法输出图形文件时需要指定输出的图形格式。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static BufferedImage read(File input) throws IOException
public static boolean write(RenderedImage im,String formatName,File output)throws IOException
  • Image类代表位图,但它是一个抽象类,无法直接创建Image对象,为此java为它提供了一个BufferedImage子类,这个子类是一个可以访问图像数据缓冲区的Image实现类。该类提供了一个简单的构造器:BufferedImage(int width,int height,int imageType):创建指定大小、指定图像类型的BufferedImage对象。除此之外,还提供一个getGraphics()方法返回该对象的Graphics对象,从而允许通过该Graphics对象向BufferedImage中添加图形。
  • Graphics是一个抽象的画笔对象,它可以在组件上绘制丰富多彩的几何图形和位图。它提供有一个重要方法,将一个img对象的原始图形宽度缩小为width,高度缩小为height,添加到BufferedImage对象的(x,y)处:public abstract boolean drawImage(Image img, int x, int y,int width,int height, ImageObserver observer)

关键的像素位乘积可能导致内存暴涨以至出现OOM

BufferedImage.java:324,DirectColorModel.java:1032,Raster.java:467,DataBufferInt.java:75

至此可以得知,提示OOM的原因为图片的宽度和高度的像素乘积过大导致在初始化int的数组的时候出现 java.lang.OutOfMemoryError: Java heap space。

BufferedImage的一些坑

BufferedImage的一些坑:

  • 项目中,BufferedImage的读取加载流程是:下载图片 -> 通过ImageIO.read()转成BufferedImage。很有可能的是,下载的图片过大,那么转成BufferedImage的对象也会很大。
  • 此外BufferedImage存储的内容是不经过压缩的,你本地磁盘上读取了一个图片文件,转成BufferedImage对象后,大小可能是文件大小的数倍。这是因为BufferedImage的对象大小是要按照位图那一套算法计算的,即像素数 * 单个像素存储大小。一般项目中都是用彩图,即24位。
    • 一个例子:一张1200 * 900的彩图A和黑白图B,大小分别为800KB和100KB,均为JPG格式,但是读到内存里后,大小变为了3MB多,这是因为它们都用彩图存储(ImageIO.read()就是这么处理的),且size = 1200 * 900 * 24 / 8 = 3240000 bytes

所以当要缓存图片或者大对象(包含大量字节串)的时候,可以考虑:

  • 对对象进行压缩(显然BufferedImage压缩比较困难,可以用第三方库?)
  • 另外我认为,对于图像的缓存(或者是大的byte[]对象),应该利用磁盘缓存或者用类似Redis那样的缓存,而不是保存在本机内存里

结论

  • 1、java对于图片的处理技术在处理小图片时,完全够用,但是在处理大于1MB以上的图片时,就不再推荐本身服务器去处理图片。
  • 2、有条件的还是将图片的处理交给第三方来,调用封装好的API等来处理图片的各种要求。

参考链接

https://keys961.github.io/2018/05/28/JVM%E5%A0%86%E5%86%85%E5%AD%98%E5%88%86%E6%9E%90/

https://blog.csdn.net/calm_encode/article/details/120427312

https://juejin.cn/post/6844903892543602702

https://blog.csdn.net/loophome/article/details/101773866

本篇文章如有帮助到您,请给「翎野君」点个赞,感谢您的支持。

首发链接:https://cloud.tencent.com/developer/article/2412452

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-05-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JAVA通过BufferedImage进行图片的绘制,缩放,裁剪,水印等操作
最近开发当中,通过JAVA对图片进行了很多的操作,之前很少接触这方面的知识,特此记录下来
海加尔金鹰
2020/06/08
13.3K0
BufferedImage类、Image类、Graphics类
Image是一个抽象类,BufferedImage是其实现类,是一个带缓冲区图像类,主要作用是将一幅图片加载到内存中(BufferedImage生成的图片在内存里有一个图像缓冲区,利用这个缓冲区我们可以很方便地操作这个图片),提供获得绘图对象、图像缩放、选择图像平滑度等功能,通常用来做图片大小变换、图片变灰、设置透明不透明等。
Twcat_tree
2022/11/30
1.2K0
BufferedImage 将照片logo添加到二维码中间
猫头虎
2024/04/08
1660
BufferedImage 将照片logo添加到二维码中间
BufferedImage与byte[]互转
在传输中,图片是不能直接传的,因此需要把图片变为字节数组,然后传输比较方便;只需要一般输出流的write方法即可;
bear_fish
2018/09/19
2.3K0
Java中图片处理工具类——能满足各种需求
在多年Java开发过程中我总结了一些处理图片的方法,把代码分享出来与大家一起学习,代码如下: import java.awt.Color; import java.awt.Graphics2D; import java.awt.Image; import java.awt.image.BufferedImage; import java.awt.image.RenderedImage; import java.io.File; import java.io.FileOutputStream; import
用户1289394
2018/02/27
5.4K0
JavaUtil_03_图片处理工具类
 一、源码 功能:缩放图像、切割图像、图像类型转换、彩色转黑白、文字水印、图片水印等 package com.ray.dingtalk.util; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Toolkit; i
shirayner
2018/08/10
1K0
java 不改变尺寸大小对图片压缩
从jpg、jpeg、png(3.44MB)压缩到440kb也非常清晰,可自动设置压缩程度(0-1),目前压缩成为jpg的比较理想,压缩后为png并不能减少多少,可能是由于png是属于无损压缩
botkenni
2022/05/19
3K0
java 不改变尺寸大小对图片压缩
如何在线生成二维码?
一、介绍 说到二维码,我相信大家每天都会用到,尤其是在手机支付的场景,使用频率极广。 实际上二维码在1994年的时候就已经诞生了,由 Denso 公司研制而成,只是那个时候使用范围还不是很大。 早期的二维码由于很容易通过技术方式进行伪造,因此很少有企业愿意去使用他,随着技术的不断迭代和更新,二维码的安全性更进一步得到了提升,从而使得更多的企业愿意使用这项新技术,例如当下的移动支付,还有微信互推,扫码出行等等,极大的方便了网民们的购物、社交和出行! 在实际的业务开发过程中,二维码的使用场景开发也会经常出现在我们开发人员的面前,我们应该如何去处理呢,今天小编就带着大家一起深入的了解一下它的技术实现过程。 二、代码实践 在 Java 生态体系里面,操作二维码的开源项目很多,如 SwetakeQRCode、BarCode4j、Zxing 等等。 今天我们介绍下简单易用的 google 公司的 zxing,zxing 不仅使用方便,而且可以还操作条形码或者二维码等,不仅有 java 版本,还有 Android 版。 开源库地址:
Java极客技术
2022/12/02
1.3K0
如何在线生成二维码?
Java一分钟之-图像处理:BufferedImage与ImageIO
在Java中,处理图像通常涉及到BufferedImage类和ImageIO工具类。本文将简要介绍这两个关键组件,以及在处理图像时常见的问题、易错点及如何避免它们。
Jimaks
2024/05/31
1.9K0
Java 代码基于开源组件生成带头像的二维码,推荐收藏!
二维码在我们目前的生活工作中,随处可见,日常开发中难免会遇到需要生成二维码的场景,网上也有很多开源的平台可以使用,不过这里我们可以通过几个开源组件,自己来实现一下。
Java极客技术
2022/12/04
7970
Java 代码基于开源组件生成带头像的二维码,推荐收藏!
java 图片加水印(图片或者文本)
对于上传的图片,有时候我们需要加上水印来标识图片的来源,以下java代码用来处理图片加文字和图片水印
日薪月亿
2019/05/14
3.5K0
Java 生成透明图片
设置图片透明import org.apache.commons.io.FilenameUtils;import org.apache.commons.io.IOUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import javax.imageio.ImageIO;import javax.imageio.stream.ImageOutputStream;import javax.swing.\*;import java.awt.\*
IT小马哥
2022/12/31
1.1K0
小玩意|图片转ASCII
今天,我们来完成一个小玩意,将图片转成ASCII,最后使用Base64转换成灰色图。如,将图
孟君
2022/11/21
1.5K0
小玩意|图片转ASCII
Java BufferedImage的基本用法
1:读取本地图片: File file = new File(”001.jpg“);//本地图片 BufferedImage image=(BufferedImage)ImageIO.read(file); 2:读取一张网上图片: URL url= new URL(”http://*******“);//url 为图片的URL 地址 BufferedImage image=(BufferedImage)ImageIO.read(url); 3:
用户5927264
2019/08/01
8.5K0
分享:Java 开发精美艺术二维码
看到网络上各种各样的二维码层出不穷,好像很炫酷的样子,一时兴起,我也要制作这种炫酷二维码效果
Krry
2018/10/26
9700
分享:Java 开发精美艺术二维码
自定义瓦片地图切图-基于腾讯地图
在腾讯地图上发一张自定义的手绘地图,由于手绘地图像素都比较高,加载一整张图速度极慢。将手绘地图按照地图的瓦片规则切片分开加载。
bug专8
2021/04/27
5.5K3
字符作画,我用字符画个冰墩墩
已经 2022 年了,最近北京冬奥会的吉祥物冰墩墩很火,据说一墩难求,各种视频新闻应接不暇。程序员要有程序员的方式,今天我来用 Java 画一个由字符组成的冰墩墩送给大家,这篇文章记录字符图案的生成思路以及过程。
未读代码
2022/03/22
1K0
字符作画,我用字符画个冰墩墩
Java打飞机小游戏(附完整源码)
技术源于分享,所以今天抽空把自己之前用java做过的小游戏整理贴出来给大家参考学习。java确实不适合写桌面应用,这里只是通过这个游戏让大家理解oop面向对象编程的过程,纯属娱乐。代码写的很简单,也很容易理解,并且注释写的很清楚了,还有问题,自己私下去补课学习。
Java团长
2018/08/06
7.3K2
Java 操作 Office:POI之word图片处理
本系列旨在分享一些word操作框架POI的一些使用技巧,系统学习可直接参考官方文档,或上一篇中提到的Apache POI Word(docx) 入门示例教程。更多交流可添加公众号【程序员架构进阶】一起探讨。
程序员架构进阶
2021/08/23
1.7K0
Java 操作 Office:POI之word图片处理
利用java生成海报
控制器: @ApiOperation("营销课题/ 生成课程海报图") @PostMapping("generatePoster") @ApiOperationSupport(order = 7) public R<String> generatePoster(@RequestBody PosterDTO posterDTO) { return courseService.generatePoster(posterDTO); } service: R<String> generatePoster(P
botkenni
2022/05/23
2K0
相关推荐
JAVA通过BufferedImage进行图片的绘制,缩放,裁剪,水印等操作
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验