2009-08-30 8 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; 

} 

追記:生データは、unsigned char型

+0

これはコンパイル時エラーまたは実行時エラーですか? –

+1

Objective-CまたはCを要求すると、この質問に「C++」とタグ付けされるのはなぜですか? – mmmmmmmm

+0

私は 0xC0DEFACE

答えて

4

割り当てられたバッファの最後をオーバーランされている可能性があります。そのため、アクセス違反が発生しています。これは、あなたの数学が割り当てに間違っているか、rawDataポインタのタイプが間違っている可能性が最も高いです。

ロードされたUIImageの生データにアクセスする場合、メモリに読み込み専用にマップされることがあります。あなたは割り当てられたバッファにデータをコピーする必要があります。

+0

はい、私はバッファの終わりを超えていました - ありがとう!ところで、バッファrawDataが* rawData = malloc(height * width * 4);と定義されている場合、バッファの終わりをテストするための良い方法がありますか? – RexOnRoids

+1

あなたが書いている場所を把握する以外には、良いテストはないと思います。 is not myLength = height * width * 4. BTWでは、各行の終わりに余分なパディングバイトがあり、それを特定のバイト境界に整列させることができます。 rowBytes値を持つ場合は、widthと組み合わせて使用​​して、パディングをヒットしたときを知ることができます。 – mahboudz

+0

バッファオーバーライトが発生していると思われる場合は、実行時にバッファの上書きを検出することができます。ターミナルウィンドウの "man malloc"は、利用可能なデバッグ機能に関する詳細情報を提供します。一方、EXC_BAD_ACCESSはいずれの場合でもバッファオーバーランの強力な指標です。 –

0

のデータバッファであるうーん... rawdataは何ですか?おそらくそれはあなたが変更することができないconstタイプですか?

+0

rawDataはunsigned char型です。 unsigned char as: * rawData = malloc(height * width * 4); – RexOnRoids

関連する問題