どのようにiPhone上BitmapContextからARGBコンポーネントを引き出すには?

StackOverflow https://stackoverflow.com/questions/561663

質問

私は、次のコードで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を作る)あなたの元々ロードされたイメージが有効であることを確認してくださいと思います。

あなたのコンテキストがnilであると、

、あなたの画像サイズは無理があるので、それがあってもよく、または他のあなたの画素データ形式は使用できません。代わりにkCGImageAlphaPremultipliedLastを使用してみてください!

第二に、あなたはCGBitmapContextGetDataを使用する必要はありません - あなたはちょうどあなたが最初の場所で渡されたpixelDataポインタを使用することができます。また、漏れを避けるために、あなたのCGContextRelease機能を離れる前に、あなたのコンテキストをinitWithImage:する必要があります。

私はまた、あなたがkCGImageAlphaPremultipliedFirstを使用していることに注意してください。あなたはalphaAtX:y:関数のアルファ成分のために0のオフセットをしたいので、これはアルファ成分は、の最初ののであることを意味し、あなたのイメージでは、続かない。

その助けのいずれかをしていますか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top