使用 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(...)
将使用特定格式的默认设置对图像进行编码。如果您想要更多控制,请使用ImageReader
和ImageWriter
并指定质量设置、元数据等。
根据文档,它是“jpeg”,而不是“jpg”。 getReaderFormatNames()
应该返回支持的格式列表。另外,检查 write() 的返回值。
@FrankOsterfeld 我在 Oracle 官方文档中看到了 jpeg
和 jpg
。我更喜欢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 类编码的图像的主要内容,如果未能解决你的问题,请参考以下文章