How to pull ARGB component from BitmapContext on iPhone?

I am trying to get ARGB components from a CGBitmapContext with the following codes:


-(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

}

code>

When I try to keep red / green / blue, they will always be 240. And alpha is always 255.

So, I think something is wrong with the pointer. It was not able to return the correct ARGB data that I want. Any ideas on what's wrong with the code?

+3
source share
2 answers

First of all, you have a memory leak, pixelData memory is never freed.

CGContext . NULL i.s.o. pixelData, , 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, .

+2

-, , , CGBitmapContextCreate ( , , context != NULL). , ( , img != nil).

, , , . kCGImageAlphaPremultipliedLast?

-, CGBitmapContextGetData - pixelData, , . CGContextRelease , initWithImage:, .

, kCGImageAlphaPremultipliedFirst. , - , , , 0 - alphaAtX:y:.

?

0

Source: https://habr.com/ru/post/1703438/


All Articles