【问题标题】:How to increase/decrease an Unsigned Char?如何增加/减少无符号字符?
【发布时间】:2009-08-30 06:11:16
【问题描述】:

我正在尝试通过数值增加/减少一定量的值来修改像素值(每通道 RGBA 8 位)。如何在 Objective-C 或 C 中做到这一点?以下代码每次都会生成“错误:EXC_BAD_ACCESS”。

// Try to Increase RED by 50
    for(int i = 0; i < myLength; i += 4) {

        //NSLog prints the values FINE as integers
            NSLog(@"(%i/%i/%i)", rawData[i], rawData[i+1], rawData[i+2]);

            //But for some reason I cannot do this
        rawData[i]+=50;

}

甚至

// Try to set RED to 50
    for(int i = 0; i < myLength; i += 4) {

            //I cannot even do this...
        unsigned char newVal = 50;
        rawData[i] = 50;

}

旁注: rawData 是 unsigned char 类型的数据缓冲区

【问题讨论】:

  • 这是编译时错误还是运行时错误?
  • 如果这个问题要求 Objective-C 或 C,为什么会被标记为“C++”?
  • 你不想使用 i

标签: iphone c objective-c bitmap unsigned-char


【解决方案1】:

您可能超出了分配缓冲区的末尾,这就是您遇到访问冲突的原因。这很可能意味着您的数学分配错误,或者您的 rawData 指针类型错误。

如果您正在访问加载的 UIImage 的原始数据,它可能会以只读方式映射到内存中。您很可能需要将数据复制到您分配的缓冲区中。

【讨论】:

  • 是的,我超出了缓冲区的末尾——谢谢!顺便说一句,如果缓冲区 rawData 定义为 *rawData = malloc(height * width * 4);,您是否知道任何测试缓冲区结束的好方法?
  • 我认为除了跟踪你的写作位置之外没有什么好的测试方法。不是 myLength = height * width * 4。顺便说一句,每行的末尾可能有一些额外的填充字节,以将其对齐到某些字节边界。如果您有 rowBytes 值,请将其与 width 结合使用以了解您何时点击填充。
  • 如果您怀疑缓冲区覆盖正在发生,则可以在运行时检测它们。终端窗口中的“man malloc”将提供有关可用调试工具的更多信息。另一方面,在任何情况下,EXC_BAD_ACCESS 都是缓冲区溢出的有力指标。
【解决方案2】:

嗯...rawdata 是什么?可能是const 类型不能修改?

【讨论】:

  • rawData 是无符号字符类型。 unsigned char 如:*rawData = malloc(height * width * 4);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-18
  • 1970-01-01
  • 2013-08-11
  • 1970-01-01
相关资源
最近更新 更多