どのようにiPhone上BitmapContextからARGBコンポーネントを引き出すには?
質問
私は、次のコードでCGBitmapContextからARGBコンポーネントを取得しようとしている。
-(id) initWithImage: (UIImage*) image //create BitmapContext with UIImage and use 'pixelData' as the pointer
{
CGContextRef context = NULL;
CGColorSpaceRef colorSpace;
int bitmapByteCount;
int bitmapBytesPerRow;
bitmapBytesPerRow = (image.size.width * 4);
bitmapByteCount = (bitmapBytesPerRow * image.size.height);
colorSpace = CGColorSpaceCreateDeviceRGB();
pixelData = malloc( bitmapByteCount ); //unsigned char* pixelData is defined in head file
context = CGBitmapContextCreate (pixelData,
image.size.width,
image.size.height,
8, // bits per component
bitmapBytesPerRow,
colorSpace,
kCGImageAlphaPremultipliedFirst
);
CGColorSpaceRelease( colorSpace );
CGContextDrawImage(context, CGRectMake(0, 0, image.size.width, image.size.height), image.CGImage);
pixelData = CGBitmapContextGetData(context);
return self;
}
タグ
-(float) alphaAtX:(int)x y:(int)y //get alpha component using the pointer 'pixelData'
{
return pixelData[(y *width + x) *4 + 3]; //+0 for red, +1 for green, +2 for blue, +3 for alpha
}
-(void)viewDidLoad {
[super viewDidLoad];
UIImage *img = [UIImage imageNamed:@"MacDrive.png"]; //load image
[self initWithImage:img]; //create BitmapContext with UIImage
float alpha = [self alphaAtX:20 y:20]; //store alpha component
}
私は青/緑/赤の保存しようとすると、彼らは常に240とアルファであることが判明し、常に255です。
だから私は多分何かがポインタが間違っていると思います。それは私が欲しい正しいARGBデータを返すことができませんでした。コードが悪いのかについて任意のアイデア?
解決
まず、あなたがメモリリークしている、ピクセルデータメモリが解放されることは決してありません。
あなたの使用方法については、それがCGContext呼び出しがメモリを管理できるようにする方が良いでしょう。単にNULL i.s.o.を渡しますピクセルデータ、そして限り、あなたは参照があなたの状況にカウントアップ保つよう、CGBitmapContextGetData(context)
は有効なままになります。
あなたはそれが最後のエントリ(RGBA、ないARGB)であったかのように、あなたのコンテキストの作成でそのようにそれを使用する、アルファを使用して、またはalphaAtX
コードを適応しています。私はそれがアルファ値をチェックするだけだ場合、あなたはあなたがいない、あらかじめ乗算されたい場合はわからない。
すべてのように、すべての何かでます:
[...]
CGContextRelease(context);
context = CGBitmapContextCreate (NULL,
image.size.width,
image.size.height,
8, // bits per component
bitmapBytesPerRow,
colorSpace,
kCGImageAlphaLast
);
CGColorSpaceRelease( colorSpace );
CGContextDrawImage(context, CGRectMake(0, 0, image.size.width, image.size.height), image.CGImage);
pixelData = CGBitmapContextGetData(context);
[...]
コンテキストがNULLに初期化メンバ変数であると、既に正しい方向へのステップになります。
他のヒント
まず、私は、コンテキストがあなたのCGBitmapContextCreate
呼び出しから返されたかどうかをチェックします(つまり、必ずcontext != NULL
を作る)が有効です。私も(そう、確かimg != nil
を作る)あなたの元々ロードされたイメージが有効であることを確認してくださいと思います。
、あなたの画像サイズは無理があるので、それがあってもよく、または他のあなたの画素データ形式は使用できません。代わりにkCGImageAlphaPremultipliedLast
を使用してみてください!
第二に、あなたはCGBitmapContextGetData
を使用する必要はありません - あなたはちょうどあなたが最初の場所で渡されたpixelData
ポインタを使用することができます。また、漏れを避けるために、あなたのCGContextRelease
機能を離れる前に、あなたのコンテキストをinitWithImage:
する必要があります。
私はまた、あなたがkCGImageAlphaPremultipliedFirst
を使用していることに注意してください。あなたはalphaAtX:y:
関数のアルファ成分のために0のオフセットをしたいので、これはアルファ成分は、の最初ののであることを意味し、あなたのイメージでは、続かない。
その助けのいずれかをしていますか?