图像获取像素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 的其余文档中,很可能有一种更简单的方法来完成您正在尝试做的事情,但是使用文档中的一些自定义格式内容不起作用马上给我。
我有 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 的其余文档中,很可能有一种更简单的方法来完成您正在尝试做的事情,但是使用文档中的一些自定义格式内容不起作用马上给我。