要在调试器中使用 Quick Look,您需要从该缓冲区创建一个图像,定义宽度、高度、每个组件的位数、每行的字节数、CGBitmapInfo(即缓冲区中组件的顺序)为了看到它。然后就可以使用标准的调试器快速查看功能了。
- (UIImage *)imageWithBuffer:(UInt32 *)buffer width:(size_t)width height:(size_t)height {
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(buffer, width, height, 8, width * 4, colorSpace, kCGImageAlphaPremultipliedLast);
CGImageRef imageRef = CGBitmapContextCreateImage(context);
UIImage *image = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
CGContextRelease(context);
CGColorSpaceRelease(colorSpace);
return image;
}
仅供参考,以上假设您填充了 32 位值,如下所示:
UInt32 value = red | green << 8 | blue << 16 | alpha << 24;
如果你的字节顺序是相反的......
UInt32 value = red << 24 | green << 16 | blue << 8 | alpha
...那么您将为CGBitmapContextCreate 的位图信息参数添加kCGBitmapByteOrder32Little:
CGContextRef context = CGBitmapContextCreate(buffer, width, height, 8, width * 4, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Little);
如您所见,由于位图缓冲区的解释可能会根据这些参数而有所不同,因此这就是为什么调试器需要了解更多信息而不仅仅是缓冲区,以便调试器的快速查看功能能够呈现给你的图像。
注意,有人担心这是 Objective-C 代码。它在 .m 文件中的 C 函数中工作,只需更改函数签名,如下所示:
UIImage *imageWithBuffer(UInt32 *buffer, size_t width, size_t height) {
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(buffer, width, height, 8, width * 4, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGImageRef imageRef = CGBitmapContextCreateImage(context);
UIImage *image = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
CGContextRelease(context);
CGColorSpaceRelease(colorSpace);
return image;
}
产量:
不幸的是,这仍在使用UIImage。根据文档,CGImageRef 应该与 Quick Look 一起使用(不需要 UIImage),但根据我的经验,这有问题(从崩溃的 Xcode 到简单地向您展示恼人的“无法加载 Quick Look数据...”消息)。