我需要遍历YUV NV12缓冲区的像素并设置颜色。我能得到的最接近的答案是这个,但这是针对BGR缓冲区的:https://stackoverflow.com/a/37346547/568531
我认为NV12格式的转换应该很容易,但我不知道。如果我可以将顶部的50x50像素(以0,0设置为白色)设置为白色。预先谢谢你。
Edit:这是我到目前为止的内容。有点工作,但是没有一个正方形,而是一个垂直的矩形,因此数学运算在某处不正确:
uint8_t *lumaBaseAddress = CVPixelBufferGetBaseAddressOfPlane(imageBuffer, 0);
uint8_t *chromaBaseAddress = CVPixelBufferGetBaseAddressOfPlane(imageBuffer, 1);
uint8_t lumaBytesPerRow = CVPixelBufferGetBytesPerRowOfPlane(imageBuffer, 0);
uint8_t chromaBytesPerRow = CVPixelBufferGetBytesPerRowOfPlane(imageBuffer, 1);
for(int column = 0; column <= 50; column++)
{
for(int row = 0; row <= 50; row++)
{
uint8_t *lumapixel = lumaBaseAddress + (row + column * lumaBytesPerRow);
uint8_t *chromapixel = chromaBaseAddress + ((column/2)*chromaBytesPerRow+(row/2) * 2);
lumapixel[0] = 0;
lumapixel[1] = 0;
lumapixel[2] = 0;
lumapixel[3] = 0;
chromapixel[0] = 255; // cyan ?
chromapixel[1] = 255; // yellow ?
chromapixel[2] = 0;
}
}
您是否尝试将前3个字节(12位)*像素数设置为全0x00或全0xFF?由于您似乎并不关心转换,因此只需覆盖缓冲区就足够了。如果这样可行,则可以解决其他问题,例如找到正确的颜色并生成矩形而不是线条。
首先,您需要了解YUV编码。 https://wiki.videolan.org/YUV#NV12。根据本文档,您很可能需要覆盖Y范围和UV范围中的位。因此要在两个不同的位置进行书写。这与所有像素颜色都具有紧密局部性的RGB缓冲区完全相反。因此,您可以开始并覆盖Y范围内的前8位以及UV范围内的前2位或后2位。那应该将一个像素设置为与以前不同的颜色。
最后,您可以处理50x50矩形的显示。您需要知道图像的尺寸,因为您需要在每行之后偏移(如果缓冲区是按行传输的!)。例如,此图:
.------.
|xx |
|xx |
| |
'------'
在具有行主要传输值的rgb颜色空间中,缓冲区看起来像这样:xx0000xx0000000000
。因此,您将需要覆盖字节0-6和字节18-24(RGB)。因为:第一范围* 3字节RGB。然后下一个范围从行号(1)*图像宽度(6)* 3字节(RGB)开始,依此类推。您必须对YUV颜色空间应用相同的想法。