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

I don't understand a code to load picture in java

我在 java 中使用 OpenCV,但我不理解 class 中加载图片的部分 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;
  }

Main class 向此 class 发送一个 Mat 对象。

结果发送 BufferedImage 但我不明白 targetPixels 因为这个 class 没有在其他地方使用它。但是每当我评论 targetPixels 和 System.arraycopy 时,结果显示黑色图片。

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

targetPixels 是新图像的主要图像数据(即像素)。当像素数据从 buffer 复制到 targetPixels 时创建实际图像。

关键不在于那个数组,而是让你到达那里的方法。

您从这里开始:getRaster(). That is supposed to return a WritableRaster ...等等。

class 正在使用来自 getDataBuffer() 的光栅 class;我们发现:

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

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

那个作业:

final byte[] targetPixels = ...

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

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

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

即使这在今天行得通,也不够稳健;将来可能很容易坏掉。另一件事:请注意,此代码执行无条件转换 (DataBufferByte)。如果缓冲区不完全具有该类型,则该代码将抛出 RuntimeException。

大概就是"all fine";因为它都与 "AWT" classes 有关,可能已经存在了很长时间;并且不会再有任何改变。但正如所说;此代码有各种潜在问题。

targetPixels 是新创建的 BufferedImage 中的字节数组,这些字节是空的,因此您需要使用 System.arraycopy.. :)

将缓冲区中的字节复制到其中