我想分析来自iOS相机的逐帧像素。我想知道是否有任何理由从CVImageBufferRef转到CGImageRef,然后从CGImageRef获取像素,或者这些数据是否基本相同。想到的事情可能是在转换过程中发生的色彩空间魔术?
答案 0 :(得分:0)
我只是在研究这个问题并发现CVImageBufferRef通常可以直接读取为24 BPP像素,但棘手的部分是检查CVPixelBufferGetBytesPerRow(imageBuffer)的结果来处理每行返回字节的情况与width * sizeof(uint32_t)不同。在我的代码中,我需要将输入像素展平为一个不包含填充字节的缓冲区,所以这就是我所做的:
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);
...
int outputBytesPerRow = width * sizeof(uint32_t);
if (bytesPerRow == outputBytesPerRow) {
// In this optimized case, just copy the entire framebuffer in one go
memcpy(frameBuffer.pixels, baseAddress, frameBuffer.numBytes);
} else {
// Non-simple layout where padding bytes appear after the pixels, need to copy
// one row at a time into the flat pixel buffer layout.
for (int rowi = 0; rowi < height; rowi++) {
void *inputRowStartPtr = baseAddress + (rowi * bytesPerRow);
void *outputRowStartPtr = frameBuffer.pixels + (rowi * outputBytesPerRow);
memcpy(outputRowStartPtr, inputRowStartPtr, outputBytesPerRow);
}
}