首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CGImageRef到char*数组

CGImageRef到char*数组
EN

Stack Overflow用户
提问于 2015-09-17 19:50:22
回答 1查看 248关注 0票数 0

我需要从窗口获取原始的BRGA数据。根据我所看到的,这样做的常见方法是:

代码语言:javascript
复制
    int bgraDataLen = 0;
    CGImageRef windowImage = CGWindowListCreateImage(CGRectNull, kCGWindowListOptionIncludingWindow, windowId, kCGWindowImageBoundsIgnoreFraming);

    CFDataRef bgraDataRef = CGDataProviderCopyData(CGImageGetDataProvider(windowImage));
    bgraDataLen = CFDataGetLength(bgraDataRef);
    *bgraData = new unsigned char[bgraDataLen]; //This is what I need
    CFDataGetBytes(bgraDataRef, CFRangeMake(0, bgraDataLen), *bgraData);
    CGImageRelease(windowImage);
    CFRelease(bgraDataRef);

我对这个解决方案的问题是,CGDataProviderCopyData会复制整个缓冲区。我想避免它,只需要一个指向原始数据的指针。我不介意它是只读的。有没有更好的方法呢?

EN

回答 1

Stack Overflow用户

发布于 2015-09-17 20:53:34

下意识:不,没有。一个图像引用根本不能保证有CPU可以访问的图像数据,或者任何特定格式的数据。保存的数据也可能发生变化。因此,复制语义提供了一种很好的方式来表示“给我数据,让我来照看它”。

示例:

  • 你正在GPU上拍摄一些快照,所以它们可能不在CPU的地址空间中,并且很可能是特定于GPU的格式(它们不倾向于线性布局,因为对于相当多常见的GPU用例来说,这是缓存低效)。如果你只是绘制到另一个图形处理器缓冲区,那么数据可能永远不会到达CPU。
  • 你已经使用过CGImageCreateWithPNGDataProvider,在这种情况下,API保留在实际使用之前不解码该PNG的权利,然后将其解码为它认为合适的任何格式。因此,图像会悄悄地发生变化。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32629638

复制
相关文章

相似问题

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