CGDisplayStream的CoreGraphics CGImage怪异颜色

时间:2018-10-15 08:58:27

标签: c++ core-graphics screenshot cgimage

我目前是第一次使用CoreGraphics API(主要是C ++代码),我尝试从CGDisplayStream中获取缩略图(或“屏幕截图”),除了颜色之外,其他方法都可以正常工作。

我使用CGDisplayStreamCreate() (documentation)创建CGDisplayStream,并在处理程序块(see this)中使用IOSurfaceRef创建CGImageRef。 这是我的测试代码:

CVPixelBufferRef p_buffer = NULL;
CFDictionaryRef attributes = CFDictionaryCreate(NULL, NULL, NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);

CVReturn ret = CVPixelBufferCreateWithIOSurface(kCFAllocatorDefault, surface, attributes, &p_buffer);

CVPixelBufferLockBaseAddress(p_buffer, kCVPixelBufferLock_ReadOnly);

void* baseAddr = CVPixelBufferGetBaseAddress(p_buffer);
size_t width = CVPixelBufferGetWidth(p_buffer);
size_t height = CVPixelBufferGetHeight(p_buffer);

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

CGContextRef cgContext = CGBitmapContextCreate(baseAddr, width, height, 8, CVPixelBufferGetBytesPerRow(p_buffer), colorSpace, kCGImageAlphaNoneSkipLast);

CGImageRef img = CGBitmapContextCreateImage(cgContext);

创建CGDisplayStream的调用如下:

CGDisplayStreamCreate(CGMainDisplayID(), 1920, 1080, 'BGRA', NULL,
                     ^(CGDisplayStreamFrameStatus status, uint64_t time, IOSurfaceRef surface, CGDisplayStreamUpdateRef metadata){ //above handler snipped is in here });

我怀疑pixelFormat (see this)或CGColorSpace正在产生我的奇怪输出,但我不确定。我也不知道我现在能做什么,只是盲目猜测一些随机设置。 也许有人可以给我一个线索?

这是我的输出和“真实”屏幕截图。

This is my output This is a "real" screenshot

1 个答案:

答案 0 :(得分:0)

最终找到了解决方法here

我换了线

CGContextRef cgContext = CGBitmapContextCreate(baseAddr, width, height, 8, CVPixelBufferGetBytesPerRow(p_buffer), colorSpace, kCGImageAlphaNoneSkipLast);

CGContextRef cgContext = CGBitmapContextCreate(baseAddr, width, height, 8, CVPixelBufferGetBytesPerRow(p_buffer), colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipFirst);

现在工作正常。

我仍然不太清楚为什么这是一个解决方案。我想这时需要进一步了解图像格式和颜色。