Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Xcode调试器中查看位图(在C中)?_C_Xcode_Debugging - Fatal编程技术网

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

如何在Xcode调试器中查看位图(在C中)?,c,xcode,debugging,C,Xcode,Debugging,我得到了一些位图数据,它是由一个C变量指向的32位整数(每个是rgba)像素组成的数组。有没有办法在Xcode调试器中查看位图数据描述的图像 编辑:这里有一个答案依赖于源代码是Objective C。我特别想问,如果答案中列出的类型在C中不存在(据我所知),如何对C源代码执行此操作。要在调试器中使用Quick Look,您需要从该缓冲区创建一个图像,定义宽度、高度,每个组件的位,每行的字节,使用CGBitmapInfo(即缓冲区中组件的顺序)来查看它。然后可以使用标准调试器快速查看功能 - (U

我得到了一些位图数据,它是由一个C变量指向的32位整数(每个是rgba)像素组成的数组。有没有办法在Xcode调试器中查看位图数据描述的图像


编辑:这里有一个答案依赖于源代码是Objective 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;
如您所见,由于位图缓冲区的解释可能因这些参数而异,因此这就是调试器需要了解更多信息而不仅仅是缓冲区的原因,以便调试器的快速查看功能能够为您呈现图像


注意,有人担心这是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数据”消息)。

如果有,我会感到惊讶。令人惊讶的是,它在objective C中具有此功能,用于特定的数据类型:Nice。我觉得自己老了。@EugeneSh和我们许多人一样:(@fearpi-FYI,该快速查找链接不适用于32位值的简单数组。这不是该问题的重复。在使用快速查找功能之前,您需要从中创建图像上下文。
CGContextRef context = CGBitmapContextCreate(buffer, width, height, 8, width * 4, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Little);
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;
}