我在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
是什么 - 它做了什么?
答案 0 :(得分:2)
关于那个数组的重点不是很重要,而是让你在那里的方法。
你从这里开始:getRaster()。这应该返回WritableRaster ......等等。
该类正在使用来自Raster类的getDataBuffer();我们在那里找到:
表示矩形像素数组的类。 Raster封装了一个存储样本值的DataBuffer和一个描述如何在DataBuffer中定位给定样本值的SampleModel。
本质上发生了什么: Image 对象,最后有一个字节数组,应该包含某些信息。
那个任务:
final byte[] targetPixels = ...
检索该内部数据的引用;然后arrayCopy()
用于将数据复制到该数组中。
对于记录:这看起来不是一个好的方法 - 因为当getData()
会创建内部数据的副本呢?
换句话说:此代码尝试获取直接访问某些对象的内部数据;然后操纵内部数据。
即使今天有效,它也不健壮;并且可能在将来容易破裂。另一件事:请注意,此代码执行无条件转换(DataBufferByte)
。如果缓冲区没有完全相同的类型,那么该代码会抛出RuntimeException。
可能就是"一切都很好&#34 ;;因为它全部与" AWT"可能存在多年的课程;并且不会再改变了。但正如所说;这段代码有各种潜在的问题。
答案 1 :(得分:0)
targetPixels
是新图像的主要图像数据(即像素)。将pixeldata从buffer
复制到targetPixels
时,会创建实际图像。
答案 2 :(得分:0)
targetPixels是新创建的BufferedImage中的字节数组,这些字节为空,因此您需要使用System.arraycopy将缓冲区中的字节复制到它。:)