繁体   English   中英

JAVA:如何从BufferedImage创建“ png”图像。 映像必须在DevIL库中可打开

[英]JAVA: How to create “png” image from BufferedImage. Image has to be openable in DevIL library

我需要将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) 

这是代码。 我甚至用注释行尝试了它。 我在Google上找到了一些东西。 此消息是典型的不良图像格式。 但是我不知道如何做像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库

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

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

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

我查看了您附带的图像,它们看上去都是完全有效的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块(和其他一些辅助块),但这无关紧要)。

除此之外,我还发现DevIL正在使用LibPNG(这可能是最标准且使用最广泛的PNG库)来读取PNG,因此我确实感到奇怪,因为它无法读取此特定的PNG。 但是,这可能与该版本有关,其构建方式或其他原因(我不是C / C ++程序员,也不了解库的详细信息)。 您可能应该就此与图书馆/程序的开发人员进行交谈(并向其提出问题)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM