1

我需要将 BufferedImage 保存为 png 图像。下一步,我需要在另一个程序(Avisynth)中打开图像。该程序能够打开我在 ms-paint 中绘制的图像,但我的 java 程序创建的图像无法打开。我的程序和 ms-paint 中的图像是 png 类型,在 windows 中看起来不错。这意味着我可以打开它,并且图像包含我绘制的所有内容。在外部程序中,它会引发以下错误:

Avisynth open failure:
ImageReader error 'Could not open file' in DevIL library.
reading image"C:\Images\mask\mirror.png"
DevIL version 166.
(C:\User\admin\Documents\4555.avs) 

这是代码。即使使用注释行,我也尝试过。我在谷歌上找到了一些东西。此消息是错误图像格式的典型信息。但我不知道如何像 ms-paint 那样做同样的图像。

    BufferedImage img = new BufferedImage(video.getWidth(), video.getHeight(), BufferedImage.TYPE_INT_ARGB);
    Graphics2D g2 = (Graphics2D) img.getGraphics();
    img.getGraphics().setColor(Color.white);
    c.paintAll(img.getGraphics());
    File f = new File(path + ".png");

    opencv_core.IplImage imgs = IplImage.createFrom(img);
    opencv_highgui.cvSaveImage(f.getPath(), imgs);
    //ImageIO.write(img, "png", f);

在代码中:

c 是 JComponent,其中包含图像,我要保存,并且我使用了 JavaCL 库

4

2 回答 2

1

要读取/写入 BufferedImage,可以使用 javax.imageio.ImageIO。您还可以添加TwelveMonkeys扩展,以改进 imageio 的 I/O 操作。

另一种解决方案是使用 JAI,但它在读取图像时存在内存泄漏问题。

png 格式是一种标准,几乎所有的库/软件都支持。如果 Avisynth 无法打开使用您的 java 软件创建的图像,那肯定是因为您将其保存为稀有格式。

于 2015-09-06T07:42:35.287 回答
1

我查看了您附加的图像,它们看起来都是完全有效的 PNG 文件,并且在我尝试过的任何查看器/库中都可以正常打开。它们都使用标准的放气压缩、自适应滤波并且是非交错的。

但是,有一个重要的区别,那就是用 Java 编写的具有透明度(alpha 通道),而来自 Paint 的则没有。所有图像都没有透明像素,因此您可以尝试丢弃 alpha 通道,看看是否有帮助(仅更改代码的第一行):

int w = video.getWidth();
int h = video.getHeight();
BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_3BYTE_BGR); 

TYPE_3BYTE_BGR是 ImageIO为不透明的 PNG 返回的内容,因此它可能更快,但我认为PNGReader您也可以使用。TYPE_INT_RGB

代码中的这个小改动应该会生成更接近 Paint 创建的图像。我非常有信心这种更改应该会生成 DevIL/Avisynth 可以读取的 PNG。

(图像之间还有另一个小区别,即 Paint 图像明确包含一个sRGB块(和一些其他辅助块),但这无关紧要)。

除此之外,我看到 DevIL 正在使用 LibPNG(这可能是最标准和最广泛使用的 PNG 库)来读取 PNG,所以我确实觉得它无法读取这个特定的 PNG 有点奇怪。但是,它可能是关于这个版本的东西,它的构建方式或其他东西(我不是 C/C++ 程序员,我也不深入了解这个库)。您可能应该就此与库/程序的开发人员讨论(提出问题)。

于 2015-09-07T08:33:03.857 回答