2016-06-29 9 views
0

私はいくつかのピクセルレベルの画像操作を行うOSXアプリケーションに取り組んでいます。私は、次のコードを使用して、ピクセルカラーコンポーネント(RGBA)にアクセスします。通常のバイトはuint8ポインタとしてキャストされます。に表示される時間であるオリジナルCGImageRefに影響を(持っているように見えていないメモリのこの領域を変更するCGImageRefの基礎となるバイトにアクセスして変更しますか?

for (int i = 0; i < [data length]; i += 4) { ... } 

:この時点で

NSImage *image = self.iv.image; 
NSRect imageRect = NSMakeRect(0, 0, image.size.width, image.size.height); 
CGImageRef cgImage = [image CGImageForProposedRect:&imageRect context:NULL hints:nil]; 
NSData *data = (NSData *)CFBridgingRelease(CGDataProviderCopyData(CGImageGetDataProvider(cgImage))); 
    uint8 *pixels = (uint8 *)[data bytes]; 

は、私は、いくつかのバイトレベルの変更を適用します NSImageView)。私はそれに応じて画像の更新を確認するために、次の操作を行う必要があります。つまり

CGImageRef newImageRef = CGImageCreate (width, 
              height, 
              bitsPerComponent, 
              bitsPerPixel, 
              bytesPerRow, 
              colorspace, 
              bitmapInfo, 
              provider, 
              NULL, 
              false, 
              kCGRenderingIntentDefault); 

    NSSize size = NSMakeSize(CGImageGetWidth(newImageRef), 
          CGImageGetHeight(newImageRef)); 

    NSImage * newIm = [[NSImage alloc] initWithCGImage:newImageRef size:size]; 

    self.iv.image = newIm; 

は、私は変更する取り戻すバイトはおそらくCGDataProviderCopyData(CGImageGetDataProvider(cgImage)の結果として、元バイトの単なるコピーです。

私の質問は以下の通りです。 CGImageRefの基礎となるバイトに直接アクセスする方法はありますか?私はそれらを変更すると、画像を操作しながら画面上で更新されるようになりますか?

答えて

2

番号CGImageは不変です。作成後は変更できません。

[data bytes]を呼び出すと、constvoidへのポインタが返されます。 constを捨てて警告なしでコンパイルできますが、これは設計契約の違反です。データプロバイダをバッキングしているバッファに書き込むことは合法ではなく、新しいCGImageを作成したとしても動作するとは限りません。

また、バッファ内のデータのフォーマットが期待していたものとはかなり異なる場合があることを指摘します。データがピクセルあたり32ビット、RGBAとBGRA、またはARGBとの間の差異などと期待する理由はありません。

10.6 AppKit release notesのさまざまな画像オブジェクトに関するセクションを読むことを強くお勧めします。 「NSImage、CGImage、CoreGraphicsのインピーダンスマッチング」までスクロールし、「NSComboBox」を押すまで画像関連のすべてのセクションを読んでください。 「NSBitmapImageRep:CoreGraphicsインピーダンスマッチングとパフォーマンスノート」のセクションは、あなたの目的のためにより重要です。

あなたが好む任意のフォーマットで自分自身を割り当てたピクセルバッファをそのまま維持することができます。次に、CGImageが必要な場合は、バッファから作成し、描画して破棄します。すべてのピクセル操作は、そのバッファで行われます。

関連する問題