“Java’s ImageWriter’s .write() method produces sub-par results for JPEG

images (as compared to Photoshop “Save for Web”, as an example).”

出现这种情况的原因不止一个,将Java imageio生成的图像质量与专业图像软件作为photoshop进行比较是不公平的.

无论如何,让我们看看图像中的工件最可能的原因是:通常对于将图像保存为JPEG的软件,它将允许用户指定参数作为压缩或质量,一个是另一个的反转.该参数用于缩放量化过程中使用的量化表,这是JPEG丢失的最重要因素.不同的编码器可以使用不同的量化表,其部分地考虑图像质量差异.

但是可能存在影响压缩和图像质量的其他因素,其中色度子采样(或下采样)实际上在量化过程之前发生.色度子采样是以比原始分辨率更低的分辨率对图像中的颜色信息进行采样的过程.有关更好的解释,请阅读this文章.

Calvin Hass提供了一个优秀的JPEG阻尼工具,名为JPEGSnoop,可以从http://www.impulseadventure.com下载.在你提供的ps75.jpg图像上使用这个工具,我发现以下输出与色度子采样有关:

Component[1]: ID=0x01, Samp Fac=0x11 (Subsamp 1 x 1), Quant Tbl Sel=0x00 (Lum: Y)

Component[2]: ID=0x02, Samp Fac=0x11 (Subsamp 1 x 1), Quant Tbl Sel=0x01 (Chrom: Cb)

Component[3]: ID=0x03, Samp Fac=0x11 (Subsamp 1 x 1), Quant Tbl Sel=0x01 (Chrom: Cr)

这意味着没有对颜色组件进行子采样.另一方面,100.jpg和75.jpg的子排列部分是相同的:

Component[1]: ID=0x01, Samp Fac=0x22 (Subsamp 1 x 1), Quant Tbl Sel=0x00 (Lum: Y)

Component[2]: ID=0x02, Samp Fac=0x11 (Subsamp 2 x 2), Quant Tbl Sel=0x01 (Chrom: Cb)

Component[3]: ID=0x03, Samp Fac=0x11 (Subsamp 2 x 2), Quant Tbl Sel=0x01 (Chrom: Cr)

这意味着通过取两个连续像素的平均值,在颜色分量的水平和垂直方向上进行了二次调整.

当原始图像由条带和/或正方形组成时,色度子采样对图像质量的影响将是最显着的,并且您已经注意到这里的工件更容易被看到.

因此,IMO,对于这种特殊情况,问题更多来自色度子采样而不是质量因子设置.也许我没有挖得足够深,但是我找不到设置imageio的采样因子或者它背后的ImageWriter(最有可能是com.sun.imageio.plugins.jpeg.JPEGImageWriter)的方法,尽管它似乎可以设置ImageWriter使用的量化和Huffman表.

因此,除非您为imageio编写自己的ImageWriter插件或作为独立插件,否则不太可能更改Java的ImageWriter使用的压缩算法.但考虑到JEPG压缩算法的复杂性,两者都是非平凡的.有一个相对容易遵循的James JpegEncoder实现由James R. Weeks编写,默认情况下不进行色度子采样.它曾经是免费的,但您可以通过搜索网络找到原始版本.

另一件有趣的事情是:从JPEGSnoop的输出中,photoshop保存的75%JPEG图像的实际品质因数实际上显示为92%左右.以下来自Calvin Hass网站的引用文本将回答为什么Photoshop在您的案例中不使用子采样的问题:

另外,请注意Photoshop CS2使用不同的色度子采样级别,具体取决于“保存JPEG质量”设置:

Photoshop Save As Quality 0-6 - 2x2 Chroma Subsampling

Photoshop Save As Quality 7-12 - 1x1 No Chroma Subsampling

Photoshop Save For Web Quality 0-50 - 2x2 Chroma Subsampling

Photoshop Save For Web Quality 51-100 - 1x1 No Chroma Subsampling

查看this Java图像库,它也可以编写JPEG图像.

java jpeg压缩算法_在创建JPEG时,我可以更改Java的ImageWriter使用的压缩算法吗?相关推荐

  1. java无ide编译_[转]无IDE时编译和运行Java

    本文由 ImportNew - Grey 翻译自 dzone.欢迎加入Java小组.转载请参见文章末尾的要求. 最近Java subreddit出现了一篇"在没有IDE的情况下编译Java包 ...

  2. mysql创建表格显示1064错误_尝试创建表时出现错误1064(Error 1064 when trying to create a table)...

    尝试创建表时出现错误1064(Error 1064 when trying to create a table) 这是代码: create table `team`.`User`( `UserID` ...

  3. java内置_自包含的应用程序,内置Java

    我已经看过几篇在Java 9中简要提到自包含应用程序的在线演示文稿,但我有一个问题需要我解决. 使用新模块系统,您现在只允许包含运行应用程序所需的最少代码.但是,希望运行应用程序的系统是否仍需要JRE ...

  4. java ui调试_如何使用 IBM i System Debugger 调试 Java 程序

    当在 IBM i 上使用 Java 时,您可以使用 Qshell Interpreter 或者 CL 命令提供的 Java tools,在 Qshell 环境和 IBM i 环境上进行与 Java 开 ...

  5. java面试题_阿里大厂流出的数百道 Java 经典面试题

    BAT 常问的 Java基础39道常见面试题 1.八种基本数据类型的大小,以及他们的封装类 2.引用数据类型 3.Switch能否用string做参数 4.equals与==的区别 5.自动装箱,常量 ...

  6. java 实现超时_如何实现带有超时的Runnable? - java

    我目前有一个相当简单的SSL服务器/客户端项目,其中涉及标准Java后端和Android前端.与客户端发送数据后,我想尝试从服务器读取响应.但是,我遇到了一个小问题.服务器并不总是响应,因此我不得不以 ...

  7. java输入输出流_金九银十准备季:Java异常+Java IO与NIO面试题(含答案)

    写在前面:2020年面试必备的Java后端进阶面试题总结了一份复习指南在Github上,内容详细,图文并茂,有需要学习的朋友可以Star一下! GitHub地址:abel-max/Java-Study ...

  8. java循环输入_【图文+视频新手也友好】Java一维数组详细讲解(内含练习题答案+详解彩蛋喔~)...

    [新手友好型视频+图文] 全面讲解Java一维数组(内含带答案和讲解的练习题彩蛋喔) 看完即上手!更有详解版练习题来帮你加深印象~~ 一.视频讲解 一维数组详解https://www.zhihu.co ...

  9. java 编写代码_如果您在2016年编写过Java代码-这是您不容错过的趋势

    java 编写代码 2016年最有趣的Java相关主题 关于代码,有很多热门话题,而要跟上所有事情,这是一项全职的工作. 如果您想知道如何从谷壳中分离出小麦,我们已经为您完成了工作. 在下面的文章中, ...

最新文章

  1. 使用Jupyter Notebook
  2. 上传图片和导出文件测试用例
  3. python文件管理
  4. mysql 大于号 优化_SQL优化 MySQL版 - 避免索引失效原则(二)
  5. 追剧计划第三弹!UC Berkeley出品,全栈深度学习!
  6. java nlpir_中科院NLPIR中文分词java版
  7. 7月发布?华为李昌竹确认Mate 50系列:会来的但不是现在
  8. Flutter代码锦囊---摇一摇
  9. 2.1. sql增删查改
  10. rust原声音乐_Joan Baez – Diamonds Rust
  11. pcb设计入门02-PCB封装库
  12. dwcc怎么设置html默认,Dreamweaver CC 2019如何设置界面首选项?
  13. 《乌云背后的幸福线》
  14. 3.Jenkins入门基础使用与Maven+SonarQube集成配置与实践
  15. c语言mac地址加冒号,如何通过在Excel中添加冒号来格式化单元格中的mac地址?
  16. 阿俊带你用Kotlin刷算法(二)
  17. [编译原理]吉林大学编译原理csf课件下载(1-64) 主讲:康辉 (附破解补丁)
  18. GNSS的基础知识 (GPS定位原理和组成)(1)
  19. 干货|红外热成像摄像头拆解分析
  20. What is design:the answer from Jony Ive

热门文章

  1. One Millisecond Face alignment with an Ensemble of Regression Trees
  2. Java文件流的原理与应用
  3. CRF++中的unigram和bigram features指定是uni/bigrams的输出标签
  4. 半小时让你成为EXCEL高手
  5. 随想录(我们应该编写什么样的软件)
  6. 带父节点的平衡二叉树_平衡二叉树 通俗易懂
  7. 九度搜索引擎点击优化_深圳坂田企业老总在想竞价推广和网站优化选哪个?
  8. python图像resize_Python图像resize前后颜色不一致问题
  9. 凝思系统如何调节分辨率_如何消除步进电机的噪音和振动?
  10. java nio 面试题_10个最高频的Java NIO面试题剖析!