我不明白在 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.. :)
将缓冲区中的字节复制到其中
我在 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.. :)
将缓冲区中的字节复制到其中