java - 我不明白在java中加载图片的代码

标签 java opencv bufferedimage system.array

我正在java中使用OpenCV,但我不明白在java中加载图片的类的一部分:

public class ImageProcessor {
  public BufferedImage toBufferedImage(Mat matrix){
    int type = BufferedImage.TYPE_BYTE_GRAY;
    if ( matrix.channels() > 1 ) {
        type = BufferedImage.TYPE_3BYTE_BGR;
    }
    int bufferSize = matrix.channels()*matrix.cols()*matrix.rows();
    byte [] buffer = new byte[bufferSize];
    matrix.get(0,0,buffer); // get all the pixels
    BufferedImage image = new BufferedImage(matrix.cols(),matrix.rows(),type);                    
    final byte[] targetPixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData();
    System.arraycopy(buffer, 0, targetPixels, 0, buffer.length);  
    return image;
  }

主类向此类发送一个 Mat 对象。

结果发送 BufferedImage 但我不理解 targetPixels,因为此类在其他地方没有使用它。但每当我评论 targetPixels 和 System.arraycopy 时,结果都会显示黑色图片。

我想知道什么是 targetPixels - 它有什么作用?

最佳答案

重点不在于数组,而在于实现目标的方法。

您从这里开始:getRaster() 。这应该返回 WritableRaster ...等等。

该类正在使用 getDataBuffer()来自 Raster 类;我们发现:

表示像素矩形阵列的类。 Raster 封装了一个存储样本值的 DataBuffer 和一个描述如何在 DataBuffer 中定位给定样本值的 SampleModel。

这里本质上发生了什么:Image对象最终有一个应该包含某些信息的字节数组。

该作业:

final byte[] targetPixels = ...

检索对该内部数据的引用;然后使用 arrayCopy() 将数据复制到该数组中。

郑重声明:这看起来不是一个好方法 - 因为它当此复制操作真正影响该 Image 对象的内部时才起作用。但是,如果最后一次调用 getData() 会创建内部数据的副本,该怎么办?

换句话说:此代码试图直接访问某个对象的内部数据;然后操纵内部数据。

即使现在有效,它也不够稳健;并且将来可能很容易破裂。另一件事:请注意,此代码执行无条件转换(DataBufferByte)。如果缓冲区不具有该类型,该代码将引发 RuntimeException。

也许这就是“一切都好”;因为它都与可能存在多年的“AWT”类相关;并且不会再有任何改变。但正如所说;该代码存在各种潜在问题。

关于java - 我不明白在java中加载图片的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43202915/

相关文章:

java - 如何在 Java 中对 BufferedImage 进行去饱和处理?

java - 如何用java在Backendless上上传图片?

java - Android 解析 JSON 数组

java - 将 Bing Map 请求中的字节转换为 BufferedImage 时出现问题

java - 如何从 Java 中的像素 float 组创建栅格?

c++ - Tesseract 检测质量非常低

java - 真正简单的开源 Java 游戏

java解析字符串到日期

python - Flask:TypeError:参数 '%s'的预期Ptr <cv::UMat>

c++ - 使用 mingw 将静态库 (.a) 链接到 exe