java - 将 OpenCV Mat 对象转换为 BufferedImage

标签 java image opencv bufferedimage

我正在尝试使用 OpenCV Java API 创建一个辅助函数,该函数将处理输入图像并返回输出字节数组。输入图像是保存在电脑中的jpg文件。输入和输出图像使用 Swing 在 Java UI 中显示。

System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
// Load image from file
Mat rgba = Highgui.imread(filePath);

Imgproc.cvtColor(rgba, rgba, Imgproc.COLOR_RGB2GRAY, 0);

// Convert back to byte[] and return
byte[] return_buff = new byte[(int) (rgba.total() * rgba.channels())];
rgba.get(0, 0, return_buff);
return return_buff;

return_buff 返回并转换为 BufferedImage 时,我返回 NULL。当我注释掉 Imgproc.cvtColor 函数时,return_buff 已正确转换为我可以显示的 BufferedImage。 Imgproc.cvtColor 似乎返回了一个我无法在 Java 中显示的 Mat 对象。

这是我将 byte[] 转换为 BufferedImage 的代码:

InputStream in = new ByteArrayInputStream(inputByteArray);
BufferedImage outputImage = ImageIO.read(in);

在上面的代码中,outputImage为NULL

有没有人有什么建议或想法?

最佳答案

ImageIO.read(...)(和一般的 javax.imageio 包)用于从文件格式读取/写入图像。您拥有的是一个包含“原始”像素的数组。 ImageIO 不可能从这个字节数组中确定文件格式。因此,它将返回 null

相反,您应该直接从字节创建一个 BufferedImage。我不太了解 OpenCV,但我假设 Imgproc.cvtColor(rgba, rgba, Imgproc.COLOR_RGB2GRAY, 0) 的结果将是灰度图像(8 位/样本, 1 个样本/像素)。这与 BufferedImage.TYPE_BYTE_GRAY 的格式相同.如果这个假设是正确的,你应该能够做到:

// Read image to Mat as before
Mat rgba = ...;
Imgproc.cvtColor(rgba, rgba, Imgproc.COLOR_RGB2GRAY, 0);

// Create an empty image in matching format
BufferedImage gray = new BufferedImage(rgba.width(), rgba.height(), BufferedImage.TYPE_BYTE_GRAY);

// Get the BufferedImage's backing array and copy the pixels directly into it
byte[] data = ((DataBufferByte) gray.getRaster().getDataBuffer()).getData();
rgba.get(0, 0, data);

这样做可以节省一个大的字节数组分配和一个字节数组副本作为奖励。 :-)

关于java - 将 OpenCV Mat 对象转换为 BufferedImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27086120/

相关文章:

java - 属性 'security.basic.enabled' 已弃用 : The security auto-configuration is no longer customizable

java - 没有方法在 RemoteViewsService 中触发 - Android

html - 我们可以使用 flutter 将PDF转换为图像以显示文件的缩略图吗?

c++ - 如何在 Windows 上编译 mergevec.cpp?

python - 使用python进行边缘检测

java - 强制AWS库从docker集群内的环境中获取区域

java - 澄清 Java 中正则表达式的使用

image - PNG 压缩

php - Yii 文件上传 $_FILE 为空

python - 如何从 PIL 图像创建 OpenCV 图像?