图像获取像素RGBA

Image get pixel RGBA

我有 Swift 代码显示 UIImage 的 RGBA 中的第一个像素:

let cgImage = image.cgImage
let data = cgImage.dataProvider?.data
let dataPtr = CFDataGetBytePtr(data)

let components = (
    dataPtr[0],
    dataPtr[1],
    dataPtr[p2],
    dataPtr[3]
)

当我打印组件的值时,我得到:

  - .0 : 220
  - .1 : 188
  - .2 : 129
  - .3 : 255

我想转换此代码并将其用于 Objective-C 项目,所以我 运行 在同一图像上使用此代码:

CGImageRef cgImage = image.CGImage;
CFDataRef data = CGDataProviderCopyData(CGImageGetDataProvider(cgImage));
UInt8 * dataPtr = (UInt8 *) CFDataGetBytePtr(data);

UInt8 components[4] = {
    dataPtr[0],
    dataPtr[1],
    dataPtr[2],
    dataPtr[3]
};

当我打印它时,我得到:

ܼ\x81\xff\U00000004

知道如何获得 swift 值中的值吗?

如果您通过 NSLog 打印它,您可以指定格式如下:

    UIImage *image = [UIImage imageNamed:@"Aurora"];
    CGImageRef cgImage = image.CGImage;
    CFDataRef data = CGDataProviderCopyData(CGImageGetDataProvider(cgImage));
    uint8_t *dataPtr = (uint8_t *) CFDataGetBytePtr(data);

    uint8_t components[4] = {
        dataPtr[0],
        dataPtr[1],
        dataPtr[2],
        dataPtr[3]
    };
    for (int i = 0; i < 4; i++) {
        NSLog(@"index %i val %hhu", i, components[i]);
    }

它为我提供了这个输出(对于我的示例图像):

index 0 val 20
index 1 val 39
index 2 val 55
index 3 val 255

如果您在 lldb 上打印它(使用 p/po/frame 变量),则会应用某些默认类型格式化程序。您可以使用此命令查看它们:type summary list

您可以使用此命令添加自己的自定义摘要:type summary add

https://lldb.llvm.org/use/variable.html#type-summary

在这种情况下,您应该可以这样做:

type summary add --summary-string "0=${var[0]%u}, 1=${var[1]%u}, 2=${var[2]%u}, 3=${var[3]%u}" 'uint8_t [4]'

您定义的类型摘要将列在 type summary list 的“默认”类别下。

Category: default
-----------------------
uint8_t [4]: `0=${var[0]%u}, 1=${var[1]%u}, 2=${var[2]%u}, 3=${var[3]%u}`

然后当你设置断点和 po components 它将使用定义的自定义类型摘要打印出来:

(lldb) po components
0=20, 1=39, 2=55, 3=255

您可以使用 type summary delete <summary name>(即 type summary delete "uint8_t [4]")删除类型摘要或使用 type summary clear.

删除所有自定义类型摘要

在上面 link 的其余文档中,很可能有一种更简单的方法来完成您正在尝试做的事情,但是使用文档中的一些自定义格式内容不起作用马上给我。