当前位置: 首页 > 面试题库 >

JAI ImageIO的纯Java替代品,用于检测CMYK图像

丌官远
2023-03-14
问题内容

首先,我想解释一下导致这个问题的情况/要求:

在我们的Web应用程序中,由于IE 8及更低版本无法显示它们,因此我们不支持CMYK图像(JPEG)。因此,我们需要检测何时有人要上传此类图像并拒绝它。

不幸的是,Java的ImageIO无法读取这些图像,或者使我无法获得检测到的色彩空间。通过调试,似乎在JPEGImageReader内部获得了颜色空间代码11(这意味着JCS_YCCK),但是我无法安全地访问该信息。

当向阅读器查询图像类型时,我没有得到CMYK的信息,因此我可能会假设no image types = unsupported image

我使用成像工具将源CMYK图像转换为RGB,以便测试它是否可读(我在收到“不支持CMYK”消息时尝试模拟管理员的步骤)。但是,JPEGImageReader将不会读取该图像,因为它
假定
(在源中有注释!)3分量RGB颜色空间,但是图像标头报告了4个分量(可能是RGBA或ARGB),因此IllegalArgumentException抛出。

因此,ImageIO不是一个选择,因为我无法可靠地获取图像的色彩空间,而且我也无法告诉管理员为什么由于某些内部原因而无法接受原本不错的图像(可以由浏览器显示)错误。

这使我尝试使用JAI ImageIO,CLibJPEGImageReader它的性能出色并且可以正确读取我所有的测试图像。

但是,由于我们将应用程序部署在可能还托管其他应用程序的JBoss中,因此我们希望将它们保持尽可能的隔离。AFAIK,我需要将JAI
ImageIO安装JRE或以其他方式提供本机库才能使用它们,因此其他应用程序也可能会访问它们,这可能会引起副作用(至少我们会进行大量测试以确保不是这种情况)。

这就是问题的解释,这里又来了: JAI ImageIO是否有任何纯Java替代品,可以可靠地检测并可能转换CMYK图像?

提前致谢,

汤玛士


问题答案:

我找到了可以满足我们需求的解决方案:Apache Commons
Sanselan
。该库非常快速且准确地读取JPEG标头(​​至少是我的所有测试图像)以及许多其他图像格式。

缺点是它不会读取JPEG图像数据,但是我可以使用基本的JRE工具来做到这一点。

读取JPEG图像以进行转换非常容易(ImageIO拒绝读取的图像也是如此):

JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(new FileInputStream( new File(pFilename) ) );
BufferedImage sourceImg = decoder.decodeAsBufferedImage();

然后,如果Sanselan告诉我该图像实际上是CMYK,我将获得源图像的栅格并进行自我转换:

for( /*each pixel in the raster, which is represented as int[4]*/ )
{  
   double k = pixel[3] / 255.0;

   double r = (255.0 - pixel[0])*k;
   double g = (255.0 - pixel[1])*k;
   double b = (255.0 - pixel[2])*k;
}

在RGB图像不会太亮或太暗的情况下,这会提供很好的结果。但是,我不确定为什么与乘以k防止变亮。JPEG实际上是用本机代码解码的,而我得到的CMYK->
RGB转换表示的状态有所不同,我只是尝试了乘法以查看视觉效果。

如果有人能对此有所启示,我将不胜感激。



 类似资料:
  • 问题内容: 这只是理论问题。 我将JDBC与Java应用程序一起使用,以使用数据库(选择,插入,更新,删除等)。我制作了“手动” Java类,它将包含来自数据库表的数据(属性= db列)。然后,我进行查询(ResultSet),并用数据填充这些类。我不确定这是否正确。 但是我已经阅读了很多有关JDO和其他持久性解决方案的信息。 有人可以根据他们的经验推荐最佳使用的JDBC替代品吗? 我还想知道JD

  • 问题内容: 我正在尝试为项目创建一个简单的Web浏览器,但是我正在使用JEditorPane呈现和显示HTML。我听说不应将JEditorPane用作浏览器组件,因为它不支持HTML3.2之上的任何功能(即使那样也无法正确显示它),但是我似乎找不到HTML5的替代方法。谁能帮我?提前致谢。 问题答案: 您可以使用JavaFX-2 Webview。从JavaFX-2 Adding HTML Cont

  • 问题内容: 很多年前我使用过XStream,但是我发现自2008年以来就没有更新这些库(最新消息)。现在是否有一个更现代且最新的Java XML序列化库? 问题答案: 按照偏好,相关性和活动的顺序: 访问JAXB项目的站点,以查看教程和指南。还可以查看原始的JAXB体系结构白皮书。 上面列出的JAXB项目是API的参考实现,并由GlassFish Application Server打包在其中。

  • 问题内容: 快速提问。JavaScript中的Eval是不安全的吗?我有一个JSON对象作为字符串,我需要将其转换为实际对象,以便获取数据: 如果有帮助,我正在使用jQuery的$ .ajax方法。 谢谢 问题答案: 好吧,不管是否安全,当您使用jQuery时,最好使用$ .getJSON() 方法,而不是$ .ajax(): 当您仅与自己的服务器通信时,通常被认为是安全的JSON解析,尤其是当您

  • 问题内容: 在我们的Web应用程序中,我们曾经使用Java小程序来调用MS。Office应用程序(例如Word)可用于打开,编辑文件并将其保存回服务器。 Google Chrome将不再支持NPAPI,因此很快我们将无法在Chrome中运行我们的applet。另外,似乎是MS。Edge不愿意支持Java。 因此,关于Java applet替代方案的任何建议。我们希望像以前一样为用户提供相同的体验:

  • 我有一个需求,我必须设计一个通过xml控制代码执行流的设计。这是一种状态机,我必须在状态之间移动。大约5年前,我在JBPM 4上使用过JPDL xml。但在最新的JBPM版本中,JPDL似乎不再可用。 基本上我想要像下面这样的东西,(只是基于JPDL建模) 使用JBPM和JPDL可以轻松完成上述操作,但在最新的JBPM中,如果没有JPDL,我不确定如何做到这一点。状态之间的转换基于Java类输出(