首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >图像获取像素RGBA

图像获取像素RGBA
EN

Stack Overflow用户
提问于 2022-02-17 14:01:02
回答 1查看 182关注 0票数 1

我有Swift代码显示来自UIImage的RGBA的第一个像素

代码语言:javascript
运行
复制
let cgImage = image.cgImage
let data = cgImage.dataProvider?.data
let dataPtr = CFDataGetBytePtr(data)

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

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

代码语言:javascript
运行
复制
  - .0 : 220
  - .1 : 188
  - .2 : 129
  - .3 : 255

我想转换这些代码并在Objective-C项目上使用它,所以我在相同的映像上运行这段代码:

代码语言:javascript
运行
复制
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]
};

当我把它打印出来时,我得到:

代码语言:javascript
运行
复制
ܼ\x81\xff\U00000004

知道我怎样才能得到我在快速价值中得到的价值吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-18 02:06:44

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

代码语言:javascript
运行
复制
    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]);
    }

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

代码语言:javascript
运行
复制
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

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

代码语言:javascript
运行
复制
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的“默认”类别下。

代码语言:javascript
运行
复制
Category: default
-----------------------
uint8_t [4]: `0=${var[0]%u}, 1=${var[1]%u}, 2=${var[2]%u}, 3=${var[3]%u}`

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

代码语言:javascript
运行
复制
(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删除所有自定义类型摘要。

很可能有一种更简单的方法来完成您在上面链接的其他文档中试图做的事情,但是在文档中使用一些自定义格式的东西对我来说并不是一件容易的事。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71159556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档