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\Documents55.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 is JComponent, whitch contains the image, whitch I want to save, and I used JavaCL library
要read/write一个BufferedImage,可以使用javax.imageio.ImageIO。您还可以添加 TwelveMonkeys 扩展,它改进了使用 imageio 的 I/O 操作。
另一种解决方案是使用 JAI,但它在读取图像时存在内存泄漏问题。
png格式是一种标准,几乎所有libraries/softwares都支持。如果 Avisynth 无法打开使用您的 java 软件创建的图像,那肯定是因为您将其保存为一种罕见的格式。
我查看了您的附加图像,我认为它们都是完全有效的 PNG 文件,并且在我尝试过的任何 viewer/library 中都可以正常打开。它们都使用标准的 deflate 压缩、自适应过滤并且是非隔行扫描的。
但是,有一个重要的区别,那就是 Java 写的有透明度(alpha 通道),而 Paint 没有。 None 的图像具有透明像素,因此您可以尝试只丢弃 alpha 通道,看看是否有帮助(仅更改代码的第一行):
int w = video.getWidth();
int h = video.getHeight();
BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_3BYTE_BGR);
TYPE_3BYTE_BGR
是不透明 PNG 的 ImageIO PNGReader
returns,所以它可能更快,但我认为你也可以使用 TYPE_INT_RGB
。
代码中的这个小改动应该会生成更接近 Paint 创建的图像。我非常有信心此更改会生成 DevIL/Avisynth 可以读取的 PNG。
(图像之间还有另一个小区别,即 Paint 图像明确包含一个 sRGB
块(和一些其他辅助块),但这无关紧要。
除此之外,我看到 DevIL 正在使用 LibPNG(这可能是最标准和最广泛使用的 PNG 库)来读取 PNG,所以我确实觉得它不能读取这个特定的 PNG 有点奇怪.但是,它可能与此版本有关,它的构建方式或其他(我不是 C/C++ 程序员,也不深入了解该库)。您可能应该与 library/program 的开发人员讨论(向其提出问题)。
我需要将 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\Documents55.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 is JComponent, whitch contains the image, whitch I want to save, and I used JavaCL library
要read/write一个BufferedImage,可以使用javax.imageio.ImageIO。您还可以添加 TwelveMonkeys 扩展,它改进了使用 imageio 的 I/O 操作。
另一种解决方案是使用 JAI,但它在读取图像时存在内存泄漏问题。
png格式是一种标准,几乎所有libraries/softwares都支持。如果 Avisynth 无法打开使用您的 java 软件创建的图像,那肯定是因为您将其保存为一种罕见的格式。
我查看了您的附加图像,我认为它们都是完全有效的 PNG 文件,并且在我尝试过的任何 viewer/library 中都可以正常打开。它们都使用标准的 deflate 压缩、自适应过滤并且是非隔行扫描的。
但是,有一个重要的区别,那就是 Java 写的有透明度(alpha 通道),而 Paint 没有。 None 的图像具有透明像素,因此您可以尝试只丢弃 alpha 通道,看看是否有帮助(仅更改代码的第一行):
int w = video.getWidth();
int h = video.getHeight();
BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_3BYTE_BGR);
TYPE_3BYTE_BGR
是不透明 PNG 的 ImageIO PNGReader
returns,所以它可能更快,但我认为你也可以使用 TYPE_INT_RGB
。
代码中的这个小改动应该会生成更接近 Paint 创建的图像。我非常有信心此更改会生成 DevIL/Avisynth 可以读取的 PNG。
(图像之间还有另一个小区别,即 Paint 图像明确包含一个 sRGB
块(和一些其他辅助块),但这无关紧要。
除此之外,我看到 DevIL 正在使用 LibPNG(这可能是最标准和最广泛使用的 PNG 库)来读取 PNG,所以我确实觉得它不能读取这个特定的 PNG 有点奇怪.但是,它可能与此版本有关,它的构建方式或其他(我不是 C/C++ 程序员,也不深入了解该库)。您可能应该与 library/program 的开发人员讨论(向其提出问题)。