java中使用ImageIO.write 写入png图片过慢的调优方案。

本文对比了使用ImageIO与InputStream两种方法将图片插入Excel的工作效率。通过对代码进行优化,使用InputStream方式将图片转换为字节数组并插入到Excel单元格中,显著提高了处理速度,从14秒缩短至3秒。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ImageIO方法的写入文件流方案

 File file = new File("文件名");
URL url = new URL(file);
  BufferedImage bufferedImage = ImageIO.read(url);
  // 先把读进来的图片放到一个ByteArrayOutputStream中,以便产生ByteArray
  ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
 // 这里要注意formatName要缓存后缀名
 ImageIO.write(bufferedImage, suffix, byteArrayOut);
 byte[] data = byteArrayOut.toByteArray();
 // 画图的顶级管理器,一个sheet只能获取一个(一定要注意这点)
 // anchor主要用于设置图片的属性
 HSSFClientAnchor anchor = new HSSFClientAnchor(0, // x缩放
         0, // y缩放
         1023, // 最大1023
         255, // 最大255
         (short) 5, // 宽度占几格 0开始
         i + 4, // 在第几行
         (short) 5, // 宽度占几格 0开始
         i + 4 // 第几列
 );
 patriarch.createPicture(anchor, wb.addPicture(data, XSSFWorkbook.PICTURE_TYPE_PNG));

InputStream方法的写入文件流方法(调优后的方法,通过InputStream替代ImageIO方法)

 File file = new File("文件名");
URL url = new URL(file);
  InputStream bufferedImage = url.openConnection().getInputStream();
  // 先把读进来的图片放到一个ByteArrayOutputStream中,以便产生ByteArray
  ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
  // 这里要注意formatName要缓存后缀名
  byte[] data = new byte[1024 * 300];
  int length = 0;
  while ((length = bufferedImage.read(data)) != -1){
      byteArrayOut.write(data, 0, length);
  }
  bufferedImage.close();
  byte[] data1 =byteArrayOut.toByteArray();
  // 画图的顶级管理器,一个sheet只能获取一个(一定要注意这点)
  // anchor主要用于设置图片的属性
  HSSFClientAnchor anchor = new HSSFClientAnchor(0, // x缩放
          0, // y缩放
          1023, // 最大1023
          255, // 最大255
          (short) 5, // 宽度占几格 0开始
          i + 4, // 在第几行
          (short) 5, // 宽度占几格 0开始
          i + 4 // 第几列
  );
  patriarch.createPicture(anchor, wb.addPicture(data1, XSSFWorkbook.PICTURE_TYPE_PNG));

比对发现 调优后 时间从14秒缩短到3秒

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值