我有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
知道我怎样才能得到我在快速价值中得到的价值吗?
发布于 2022-02-18 02:06:44
如果要通过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
删除所有自定义类型摘要。
很可能有一种更简单的方法来完成您在上面链接的其他文档中试图做的事情,但是在文档中使用一些自定义格式的东西对我来说并不是一件容易的事。
https://stackoverflow.com/questions/71159556
复制相似问题