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

时间:2017-04-04 09:12:55

标签: 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;
  }

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

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

我想知道targetPixels是什么 - 它做了什么?

3 个答案:

答案 0 :(得分:2)

关于那个数组的重点不是很重要,而是让你在那里的方法。

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

该类正在使用来自Raster类的getDataBuffer();我们在那里找到:

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

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

那个任务:

final byte[] targetPixels = ...

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

对于记录:这看起来不是一个好的方法 - 因为当 时,只会影响该Image对象的内部。但是如果最后一次通话getData()会创建内部数据的副本呢?

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

即使今天有效,它也不健壮;并且可能在将来容易破裂。另一件事:请注意,此代码执行无条件转换(DataBufferByte)。如果缓冲区没有完全相同的类型,那么该代码会抛出RuntimeException。

可能就是"一切都很好&#34 ;;因为它全部与" AWT"可能存在多年的课程;并且不会再改变了。但正如所说;这段代码有各种潜在的问题。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

targetPixels是新创建的BufferedImage中的字节数组,这些字节为空,因此您需要使用System.arraycopy将缓冲区中的字节复制到它。:)