2006.08.10 Thursday
CGImageRefにおけるBit操作
|
特に今作っているソフトとは関係ないんだけど、フォトショップのような画像のビット操作を行うようなソフトを作る場合、Cocoaではどうするのがベストなんだろう?
例えば、JPGファイルなどをCoreGraphicsで読み込んで、CGImageRefとして扱う場合、Rawデータの直接的なアドレス操作って、どうやってやるんだ? NSImageの場合だと、NSBitmapImageRefからRawデータにたどり着けるんだけど、これも結構無理矢理だしな〜なんかスマートじゃない気もする。 ToolBoxの時のように、PixcelMapをGWorldでビット操作するような、感覚ってOSXではどうやってやるんだろう? 特にCocoa,CoreGraphics等で… イメージ全体を回転させたり、拡大させたり、ゆがませたりは、その代わりもの凄く楽になったけど、ビット操作もしたいときの操作方法が、いまいちどこにあるかわからない… Cocoaの画像編集ソフトがあまりないのは、そういう理由なのかな? |
||



![たのしいCocoaプログラミング[Leopard対応版]](http://ecx.images-amazon.com/images/I/31jKj%2BBWJIL._SL160_.jpg)

メモリ上にRAWデータ(_imageBuffer)がだらだら並んでる時に、
CGContextRef imageContext = CGBitmapContextCreate(_imageBuffer,img_width, img_height, cBitPerComponent, pitch, colorSpace, kCGImageAlphaPremultipliedFirst|kCGBitmapByteOrderDefault);
てな感じでmmapみたいなノリのCGContextRefが取り出せるんで、後は適当なタイミングでCGBitmapContextCreateImage(imageContext)してやるとCopyOnWriteなCGImageRefがスナップショット的につくれます。
内側のラッパーがCGContextRefなのがミソで、生でデータをbit操作してもいいし、Quartzでベジェ曲線を書いてもいいという中々汎用性の高い操作が可能です。