我有一张相机拍摄的YUV_420_888图像。我想从这个图像的灰度中裁剪一个矩形,以提供给图像处理算法。这就是我到目前为止所做的:
public static byte[] YUV_420_888toCroppedY(Image image, Rect cropRect) {
byte[] yData;
ByteBuffer yBuffer = image.getPlanes()[0].getBuffer();
int ySize = yBuffer.remaining();
yData = new byte[ySize];
yBuffer.get(yData, 0, ySize);
if (cropRect != null) {
int cropArea = (cropRect.right - cropRect.left) * (cropRect.bottom - cropRect.top);
byte[] croppedY = new byte[cropArea];
int cropIndex = 0;
// from the top of the rectangle, to the bottom, sequentially add rows to the output array, croppedY
for (int y = cropRect.top; y < cropRect.top + cropRect.height(); y++) {
// (2x+W) * y + x
int rowStart = (2*cropRect.left + cropRect.width()) * y + cropRect.left;
// (2x+W) * y + x + W
int rowEnd = (2*cropRect.left + cropRect.width()) * y + cropRect.left + cropRect.width();
for (int x = rowStart; x < rowEnd; x++) {
croppedY[cropIndex] = yData[x];
cropIndex++;
}
}
return croppedY;
}
return yData;
}
此函数运行时没有错误,但我从中获取的图像是垃圾 - 它看起来像这样:
我不确定如何解决这个问题或我做错了什么。
答案 0 :(得分:1)
您的rowStart / end计算错误。
您需要根据源图像尺寸计算行开始位置,而不是根据裁剪窗口尺寸计算行开始位置。而且我不确定你从哪里得到因子2;在图像的Y通道中每个像素有1个字节。
他们应该粗略地说:
int yRowStride = image.getPlanes()[0].getRowStride();
..
int rowStart = y * yRowStride + cropRect.left();
int rowEnd = y * yRowStride + cropRect.left() + cropRect.width();