【问题标题】:CGBitmapContextGetData returning nothingCGBitmapContextGetData 什么都不返回
【发布时间】:2021-12-10 06:46:28
【问题描述】:

我想获取上下文的像素信息

不知道为什么每次return都是空的

【问题讨论】:

  • 你欺骗了自己。通过将bitmapData 声明为char*,调试器将其视为字符串。由于第一个字节显然是 0,调试器将其显示为空字符串。一切正常。使用与char* 不同的数据类型可能会更好。
  • 不要使用strlen() 和printf("%c")。它不是字符串,也不是字符数据。位图数据是二进制数据。
  • CGBitmapContextGetData返回一个void *指针,理论上他的大小是4 * pixelWidth * pixelHeight,现在看来他的空间大小不对
  • 为什么觉得尺寸不对?因为数据类型的不同(void* vs char*)?
  • 谢谢,我应该访问地址不应该得到void *的长度

标签: ios cgcontext


【解决方案1】:

屏幕截图显示代码运行正常,但数据被视为字符数据,事实并非如此。

由于变量bitmapData 被声明为char*,因此调试器将其视为以空字符结尾的C 字符串。它显示:""。这表示bitmapData 不为空,而是以空字符开头。

原始像素数据不是字符串,也不是字符数据。所以不能使用strlen()。而且不可能用printf("%c")显示。

bitmapData 只是一个指向原始位图数据的指针。给定bitmapData,无法推导出数据的长度。查询数据长度的唯一安全方法是调用:

    int length = CGBitmapContextGetBytesPerRow(context) * CGBitmapContextGetHeight(context);

由于您使用每像素 32 位创建位图,我建议将 bitmapData 声明为 uint32_t*。那么数组中的每个元素对应一个像素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-18
    • 2018-09-10
    • 2017-02-14
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多