如何在Xcode调试器中看到位图(在C中)?

时间:2016-06-06 18:50:35

标签: c xcode debugging

我以C变量指向的32位整数(每个rgba)像素的形式获得了一些位图数据。有没有办法在Xcode调试器中看到位图数据描述的图像?

编辑:这里有一个答案依赖于作为目标C的源。我正在具体询问如何为C源代码执行此操作,因为该答案中列出的类型(我所知)在C中不存在

1 个答案:

答案 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;
}

Objective-C

仅供参考,以上假设您填充了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;
}

产量:

C

遗憾的是,这仍在使用UIImage。根据文档,CGImageRef应该与Quick Look一起使用(不需要UIImage),但根据我的经验,这有问题(从崩溃Xcode到简单地向您显示烦人的“可能没有为“消息”加载快速查看数据。