图像获取像素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]
};

当我打印它时,我会得到:

ܼx81xffU00000004

你知道我如何在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-摘要

在这种情况下,你应该能够做这样的事情:

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

您定义的类型摘要将列在";默认";CCD_ 5类。

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删除所有自定义类型摘要。

从上面的链接中,很可能有一种更简单的方法可以在文档的其余部分中完成您想要做的事情,但在文档中使用一些自定义格式的东西对我来说并不是很好。

最新更新