我以C变量指向的32位整数(每个rgba)像素的形式获得了一些位图数据。有没有办法在Xcode调试器中看到位图数据描述的图像?
编辑:这里有一个答案依赖于作为目标C的源。我正在具体询问如何为C源代码执行此操作,因为该答案中列出的类型(我所知)在C中不存在
答案 0 :(得分:1)
要在调试器中使用“快速查看”,您需要从此缓冲区创建一个图像,定义宽度,高度,每个组件的位数,每行的字节数,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
...然后您为kCGBitmapByteOrder32Little
的位图信息参数添加CGBitmapContextCreate
:
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到简单地向您显示烦人的“可能没有为“消息”加载快速查看数据。