我得到了一些位图数据,它们是由一个C变量指向的32位int(每一个rgba)像素组成的数组。有没有办法在Xcode调试器中查看位图数据所描述的图像?
编辑:这里有一个答案,它依赖于源代码是客观的C。我特别询问如何为C源代码这样做,因为答案中列出的类型在C中不存在(据我所知)。
最佳答案
要在调试器中使用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
... 然后为
kCGBitmapByteOrder32Little
的bitmap info参数添加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到简单地向您显示恼人的“无法为…加载Quick Look数据”消息)。关于c - 如何在Xcode调试器中查看位图(在C中)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37664815/