我目前是第一次使用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正在产生我的奇怪输出,但我不确定。我也不知道我现在能做什么,只是盲目猜测一些随机设置。 也许有人可以给我一个线索?
这是我的输出和“真实”屏幕截图。
答案 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);
现在工作正常。
我仍然不太清楚为什么这是一个解决方案。我想这时需要进一步了解图像格式和颜色。