前些日子接到了一个需求,要求代码中计算一个网络图片的宽高,于是我想到了ImageIO.read(URL url)方法,很快就开发完了这个功能,可是到了生产后就懵逼了,很多图片地址读取不到内容。

图片都是七牛服务器的地址,全是jpg格式,在网页中显示也没有问题,这是为什么呢?

一开始有同事说图片有问题,有可能是图片原本不是jpg格式,后来直接重命名为jpg格式导致的,于是乎我下载了一张图片,在本地测试了一下,完美通过测试,应该不是这个问题。

那就应该是网络问题了,我跟了一下源码,发现在筛选ImageReaderSpi对象的时候,返回了空,jpg图片应该命中JPEGImageReaderSpi才对。又跟了一次源码,在JPEGImageReaderSpi的canDecodeInput(Object source)方法中,我发现图片流返回的前两个字节分别是0x1F和0x8B,导致这个校验返回false。百度了一下,这两个字节应该是gzip流的标识符,猜测这个图片地址是经过gzip处理之后的图片流。

那么是不是我在经过GZIPInputStream处理一下就OK了?

写个单元测试吧。

@Test

public void testReadImage() throws IOException {

String urlStr = "http://img5.mtime.cn/mg/2019/07/19/104427.91760942_235X132X4.jpg";

BufferedImage image = readImage(urlStr);

System.out.println(String.format("size: %d * %d", image.getWidth(), image.getHeight()));

}

private static BufferedImage readImage(String urlStr) throws IOException {

InputStream is = new URL(urlStr).openStream();

BufferedInputStream bis = new BufferedInputStream(is);

if (isGzip(bis)) {

return ImageIO.read(new GZIPInputStream(bis));

} else {

return ImageIO.read(bis);

}

}

private static boolean isGzip(BufferedInputStream is) throws IOException {

is.mark(0);

int b1 = is.read();

int b2 = is.read();

is.reset();

return b1 == 0x1F && b2 == 0x8B;

}

测试通过。

imageio不存在java,Java自带的ImageIO留下的坑相关推荐

  1. Java生成海报带二维码,原图或base64返回

    Maven引入包; <dependency><groupId>com.google.zxing</groupId><artifactId>core< ...

  2. java导出excel带图片_JAVA的poi实现模版导出excel(带图片).doc

    JAVA的poi实现模版导出excel(带图片) 下面是本人使用java的poi实现使用模板到处excel,内容包含图片,使用两种不同的方式实现其到处excel.但是使用jxl实现到处excel只能到 ...

  3. [Java] Java生成二维码带LOGO, LOGO加圆角白框

    先来看看效果: 实现: 生成指定文字内容的二维码 二维码中间嵌入LOGO 二维码做圆角和白色边框处理 新需求不断, 这不, 又来了个想生成带用户头像的需求. 蛮简单的- 在这里造完轮子分享给大家 因为 ...

  4. java mysql 占位符_在Java中编写带占位符的SQL语句

    C#中SQL中带占位符的语句 假设有一张学员信息表Student,通过表中的ID来找学员,查询的SQL语句如下 string sql = string.Format("select * fr ...

  5. java中不带package和带package的编译运行方式

    Java中不带package的程序和带package的程序编译的方式是不同的. 一.不带package的程序 建立个HelloWorld.java的文件,放入C:\,内容如下: public clas ...

  6. java imageio 内存问题_java中的内存泄漏ImageIO.read()

    我正在使用ImageIO.read().这是由原始应用的主要方法调用的类是这样的:java中的内存泄漏ImageIO.read() import java.awt.*; import javax.sw ...

  7. Java串口助手 带UI界面 Java串口调试工具 FPV

    Java串口助手 带UI界面 Java串口调试工具 FPV 效果图 随便讲点 依赖jar包 代码 测试用代码 效果图 随便讲点 这个说是串口调试工具有点尴尬, 因为最开始是为了用电脑在自己做的小车上玩 ...

  8. Java除法结果带小数、进一法的实现(java)

    Java除法结果带小数.进一法的实现(java) Java除法结果带小数.进一法的实现(java) 进一法: 即省略的位上只要大于零都要进一位 : 四舍五入法: 即省略的位上小于五都要舍去,但省略的位 ...

  9. Java实现发送邮件带多个附件,可以直接用

    需求: 使用JavaMail发送邮件,要求实现带多个附件功能. 下面代码可以直接使用,也可以按需优化,实现的功能如下: 自定义输出debug信息. 自定义开启SSL认证. *QQ邮箱会自动检测开启,也 ...

  10. Java发送邮件(带图片和附件)

    如何获取QQ邮箱授权码 package com.jason.mail;import com.sun.mail.util.MailSSLSocketFactory;import javax.activa ...

最新文章

  1. CentOS安装Oracle全过程
  2. 检查一棵二叉树是否为二叉查找树
  3. 【控制】《多智能体机器人系统信息融合与协调》范波老师-第4章-基于证据推理的多 Agent 分布式决策
  4. AB1601之iic驱动改造
  5. Python的enumerater
  6. JQuery框架2.位置属性|筛选方法|事件
  7. python上传文件 request_Python request post上传文件常见要点
  8. 汽车行业中SOP和PT是什么意思?
  9. kafka报错:Replication factor:larger than available brokers
  10. python合并excel表格
  11. 使用dd命令在Linux下创建大文件,批量大小文件生成方法
  12. 2021年南京邮电大学自动化学院、人工智能学院考研指南
  13. CBL-Mariner
  14. 这应该是第一篇写拼多多商业模式的文章吧
  15. 利用cpolar为群晖NAS建立稳定外网地址(1)
  16. 浅谈emoji(分析与使用)
  17. 工具条研究手记(2) - 认识CToolBar工具条类
  18. qt 回车事件之Qt::Key_Return与Qt::Key_Enter
  19. java程序到winds下的服务
  20. 机器学习算法之——走近卷积神经网络(CNN)

热门文章

  1. 《数据通信与网络》笔记--广域网SONET/SDH
  2. I hope this letter finds you well-个人博客22-11-26
  3. 啊哈添柴挑战1057向世界问好C++
  4. maximum-subarray[最大连续子序列]
  5. 为每天节省两小时-华芸AS4004T万兆NAS搭建测试
  6. CDA I级学习 - 漏斗模型
  7. 城市按A-Z json表
  8. Android 11 Audio框架探索之AudioTracK(二)
  9. Thanos 与 VictoriaMetrics,谁才是打造大型 Prometheus 监控系统的王者?
  10. ZBrush新手推荐使用这17个小技巧和常用快捷键、笔刷