我正在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/