JAVA:如何创造" png"来自BufferedImage的图像。图片必须可在DevIL库中

时间:2015-09-05 17:01:22

标签: java image bufferedimage devil avisynth

我需要将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,whitch包含图像,我想要保存,我使用JavaCL库

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

我已经查看过您附加的图片了,我们看起来都是完全有效的PNG文件,并且在我尝试过的任何查看器/库中都打开了。它们都使用标准的deflate压缩,自适应滤波和非隔行扫描。

然而,有一个重要的区别,那就是从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 PNGReader为不透明PNG返回的内容,因此它可能更快,但您也可以使用TYPE_INT_RGB

代码中的这个小变化应该产生一个更接近Paint创建的图像。我非常确信这个改变应该产生一个Devil / Avisynth可以阅读的PNG。

(图像之间还存在另一个小差异,即Paint图像显式包含sRGB块(以及其他一些辅助块),但这不重要。 / p>

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