【问题标题】:How do I see a bitmap (in C) in the Xcode debugger?如何在 Xcode 调试器中查看位图(C 语言)?
【发布时间】:2016-10-06 11:56:04
【问题描述】:

我有一些位图数据,格式为由 C 变量指向的 32 位整数(每个 rgba)像素数组。有什么办法可以在Xcode调试器中看到位图数据描述的图像?

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

【问题讨论】:

  • 如果有的话我会很惊讶。
  • 令人惊讶的是,它具有这种能力——在目标 C 中,针对特定数据类型:stackoverflow.com/questions/2780793/…
  • 不错。我觉得老了..
  • @EugeneSh。 - 和我们许多人一样:(
  • @fearpi - 仅供参考,该快速查看链接不适用于简单的 32 位值数组。这不是那个问题的重复。您需要先从中创建图像上下文,然后才能使用快速查看功能。

标签: c xcode debugging


【解决方案1】:

要在调试器中使用 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数据...”消息)。

【讨论】:

    猜你喜欢
    • 2011-03-23
    • 2012-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 2014-06-16
    • 2010-09-11
    相关资源
    最近更新 更多