将CVImageBufferRef转换为CGImageRef以直接处理像素的任何一点?

时间:2011-05-05 05:25:00

标签: ios ios4 video

我想分析来自iOS相机的逐帧像素。我想知道是否有任何理由从CVImageBufferRef转到CGImageRef,然后从CGImageRef获取像素,或者这些数据是否基本相同。想到的事情可能是在转换过程中发生的色彩空间魔术?

1 个答案:

答案 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);
    }
  }