2009-08-30 21 views
1

我试图修改像素值(每通道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型

+0

这是编译时错误还是运行时错误? – 2009-08-30 06:40:22

+1

为什么这个问题标记为“C++”,如果它要求Objective-C或C? – mmmmmmmm 2009-08-30 08:30:05

+0

难道你不想使用我 0xC0DEFACE 2009-08-31 04:06:30

回答

4

您可能超出了分配的缓冲区的末端,这就是为什么你会遇到访问冲突。这很可能意味着你的数学在分配上是错误的,或者你的rawData指针是错误的类型。

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

+0

是的,我超越了缓冲区的末端 - 谢谢!顺便说一句,如果缓冲区rawData被定义为* rawData = malloc(height * width * 4);您知道任何测试缓冲区结束的好方法吗? – RexOnRoids 2009-08-30 06:38:41

+1

除了记录你写的地方以外,我不认为有一个好的测试。不是myLength = height * width * 4.顺便说一句,在每行末尾可能会有一些额外的填充字节,以便将其与某些字节边界对齐。如果您有一个rowBytes值,请将其与宽度结合使用以了解何时点击填充。 – mahboudz 2009-08-30 07:36:59

+0

如果您怀疑它们正在发生,可以在运行时检测缓冲区覆盖。终端窗口中的“man malloc”将提供有关可用调试工具的更多信息。另一方面,在任何情况下,EXC_BAD_ACCESS都是缓冲区溢出的强有力指标。 – 2009-09-01 05:59:25

0

嗯的数据缓冲区...什么是rawdata?也许这是一个const类型,你不能修改?

+0

rawData是unsigned char类型。 unsigned char如: * rawData = malloc(height * width * 4); – RexOnRoids 2009-08-30 06:19:17