我需要将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库
答案 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 ++程序员,我也不知道库的深度)。您应该与图书馆/程序的开发人员讨论(提出问题)。