聊聊ImageIO使用argb操作jpg的bug

本文主要来聊一下使用ImageIO在BufferedImage.TYPE_INT_ARGB默认下操作jpg格式图片显示黑色的bug。

bug

  • JDK-4712797 : ImageIO fails to decode YCbCr JPEGs that do not have a JFIF marker
  • JDK-4776576 : REG: ImageIO reader produces an incorrect image when read as a RenderedImage

复现实例

public void testArgbOnJpg() throws IOException {
        int width = 400;
        int height = 400;
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2 = image.createGraphics();
        g2.setColor(Color.WHITE);
        g2.fillRect(0, 0, width, height);
        g2.setComposite(AlphaComposite.Src);
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        g2.setColor(Color.RED);
        Ellipse2D.Float shape = new Ellipse2D.Float(20, 20, 10, 10);
        g2.fill(shape);

        g2.dispose();
        image.flush();

        ImageIO.write(image,"jpg",new File("out.jpg"));
    }

可以发现输出的图片黑屏。

修复

BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

jpg情况下,改为使用BufferedImage.TYPE_INT_RGB,即可正常显示。

doc

  • Colors appear wrong in image file if image type is TYPE_INT_ARGB and writing with ImageIO
  • jpeg image color gets drastically changed after just ImageIO.read() and ImageIO.write()

原文发布于微信公众号 - 码匠的流水账(geek_luandun)

原文发表时间:2017-10-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏lonelydawn的前端猿区

前端验证码绘制(canvas)

一切尽在代码中 js文件 /** * canvas绘制动画浮动验证码 * code by lonelydawn 2017-04-10 */ var c...

35070
来自专栏流媒体人生

使用ffmpeg dxva技术解码

ffmpeg中已经实现了使用dxva加速解码部分代码。但是要整合在自己的播放器中dxva相关管理代码没有实现。

44420
来自专栏跟着阿笨一起玩NET

从sql server 中读取二进制图片

25510
来自专栏tkokof 的技术,小趣及杂念

随便聊聊水面效果的2D实现(二)

之前提到想要随便聊一聊RippleEffect的2D实现方法,近来又总算有了些许空余时间,于是便有了这篇东西~

32530
来自专栏小鹏的专栏

ubuntu下C++如何调用python程序,gdb调试C++代码

Linux下gdb调试C++代码:http://jingyan.baidu.com/article/acf728fd464984f8e410a369.html ...

35590
来自专栏Android知识点总结

看得见的数据结构Android版之开篇前言

9120
来自专栏菩提树下的杨过

Flash/Flex学习笔记(40):弹性运动续--弹簧

上一篇里演示的弹性运动加上摩擦力因素后,物体最终基本上都会比较准确的停在目标位置。但是我们回想一下现实世界中的弹簧,如果把弹簧的一头固定起来(即相当于目标点),...

20750
来自专栏游戏杂谈

CURLcode的定义

http://curl.haxx.se/libcurl/c/libcurl-errors.html

42920
来自专栏菩提树下的杨过

Silverlight Telerik控件学习:TreeView数据绑定并初始化选中状态、PanelBar的Accordion效果、TabPanel、Frame基本使用

实际开发中控件的数据源肯定是动态绑定的,不可能在xaml里写死item项。既然要绑定,就先来几个实体类: ? 上面是类图,各类的代码如下:  Business...

31180
来自专栏叁金大数据

EmguCV学习——视频与图片互转

其实视频转图片在上篇文章中已经有些眉目了,其实就是按帧读取视频,然后把帧保存就ok。然后自己再加个进度条美化一下。。。这代码简单易懂,还是直接上代码吧。

27510

扫码关注云+社区

领取腾讯云代金券