使用 Qt 解码使用 Java ImageIO 类编码的图像

Posted

技术标签:

【中文标题】使用 Qt 解码使用 Java ImageIO 类编码的图像【英文标题】:Decoding with Qt an Image Encoded with Java ImageIO class 【发布时间】:2013-11-26 17:54:46 【问题描述】:

我想使用 C++ 显示图像,更准确地说是使用 Qt 框架。 图像已使用 ImageIO.write 方法以这种方式编码:

          BufferedImage originalImage = ImageIO.read(new File("c:\\image.jpg"));
          // convert BufferedImage to byte array
          ByteArrayOutputStream baos = new ByteArrayOutputStream();
          ImageIO.write(originalImage, "jpg", baos);
          baos.flush();
          imageInByte = baos.toByteArray();
          baos.close();

然后将 ByteArrayOutputStream 的内容简单地转储到文件 image.out 中,这是我需要使用 C++ 转换回 Image 的文件。 我看到文件 image.jpg 的大小大于 image.out 文件的大小,因此 Java 必须进行一些我不知道的压缩或编码。所以我不能只将图像读取为 JPG 并将其放入 QImage 或 QPixmap 对象中。

有人知道 ImageIO 类是如何编码图像的吗?

【问题讨论】:

你试过用 Qt 阅读它吗? 不,我没有。我只是尝试用 GIMP 和 Windows 图像查看器打开它,但都失败了。我认为 Qt 需要 jpg 格式的图像,而不是这种类型的编码。 为什么你解码图像只是为了再次编码?为什么不直接在 Qt 中打开图像?或者您是否也打算在 Java 中添加图像处理功能? PS:使用ImageIO.write(...) 将使用特定格式的默认设置对图像进行编码。如果您想要更多控制,请使用ImageReaderImageWriter 并指定质量设置、元数据等。 根据文档,它是“jpeg”,而不是“jpg”。 getReaderFormatNames() 应该返回支持的格式列表。另外,检查 write() 的返回值。 @FrankOsterfeld 我在 Oracle 官方文档中看到了 jpegjpg。我更喜欢jpeg,但两者都有效,并且与标准 ImageIO JPEG 插件等效。检查write()的返回值的好点! 【参考方案1】:

有人知道 ImageIO 类是如何编码图像的吗?

最好的选择可能是从 Oracle 读取Java Image I/O API Guide。

它描述了用于编写的基础知识和插件机制。您至少要阅读第 3 节(尤其是关于 ImageWriter 的第 3.4 节),也许要阅读第 4.1 节以了解插件概念。

有关如何控制 JPEG 格式特定写入设置的详细信息,请参阅JPEGImageWriteParam API 文档。

PS:不过,您的代码看起来还不错,并且应该提供有效的 JPEG,前提是 ImageIO 阅读器插件可以读取您的初始文件(com.sun.imageio.plugins.JPEGImageReader 对于非标准文件非常严格,即使大多数其他软件很高兴阅读它们)。

PPS:标准 ImageIO JPEG 写入器插件 (com.sun.imageio.plugins.JPEGImageWriter) 使用 Independent JPEG Group (IJG) JPEG 库来写入其 JPEG 流。我认为您无法获得比这更多的“标准”。

【讨论】:

以上是关于使用 Qt 解码使用 Java ImageIO 类编码的图像的主要内容,如果未能解决你的问题,请参考以下文章

在 AppEngine Java 上解码二维码

imageio.write的参数

无法使用 java swing 从类路径渲染图像?

java IMAGEIO

java图片处理

qt语音解码cg729(widget类)