2009-08-30 3 views
1

Я пытаюсь изменить значения пикселей (8 бит на канал RGBA) путем численного увеличения/уменьшения значений на определенную величину. Как я могу сделать это в 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; 

} 

Sidenote: RAWDATA представляет собой буфер данных типа неподписанные символ

+0

Является ли это ошибкой во время компиляции или ошибкой во время выполнения? –

+1

Почему этот вопрос помечен как «C++», если он запрашивает Objective-C или C? – mmmmmmmm

+0

Не хотите ли вы использовать i 0xC0DEFACE

ответ

4

Возможно, вы превысили конец выделенного буфера, и именно поэтому вы получаете нарушение доступа. Скорее всего, это означает, что ваша математика неверна в распределении, или указатель rawData имеет неправильный тип.

Если вы получаете доступ к необработанным данным загруженного UIImage, он может быть отображен в память только для чтения. Скорее всего, вам нужно скопировать данные в буфер, который вы выделили.

+0

Да, я был обгоняем конец буфера - Спасибо! Кстати, знаете ли вы, какой хороший способ проверить конец буфера, если буфер rawData определен как * rawData = malloc (высота * ширина * 4) ;? – RexOnRoids

+1

Я не думаю, что есть хороший тест, отличный от отслеживания того, где вы пишете. Не myLength = высота * ширина * 4. Кстати, в конце каждой строки могут быть дополнительные байты заполнения, чтобы выровнять их с определенными границами байтов. Если у вас есть значение rowBytes, используйте его в сочетании с шириной, чтобы узнать, когда вы нажмете наложение. – mahboudz

+0

Можно обнаружить перезапись буфера во время выполнения, если вы подозреваете, что они происходят. «man malloc» в окне терминала даст дополнительную информацию об имеющихся средствах отладки. С другой стороны, EXC_BAD_ACCESS является сильным индикатором переполнения буфера, в любом случае. –

0

Хм ... Что rawdata? Может быть, это тип const, который вы не можете изменить?

+0

rawData имеет тип unsigned char. unsigned char Как в: * rawData = malloc (высота * ширина * 4); – RexOnRoids

Смежные вопросы