我试图从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和Alpha始终为255。

所以,我想,也许事情是错误的指针。它不能返回我想正确的ARGB数据。关于什么是错的代码的任何想法?

有帮助吗?

解决方案

首先,你泄漏内存,内存PixelData取出永远不会被释放。

有关您的使用情况,最好让CGContext上调用管理内存。简单地传递NULL I.S.O. PixelData取出,只要你保持引用计数在您的背景下,CGBitmapContextGetData(context)将仍然有效。

您正在使用的α,如果它是最后一个条目(RGBA,不ARGB),使用它作为这样在创建你的背景下,或调整alphaAtX代码。我不知道,如果你想预乘,如果它只是检查alpha值,你不知道。

所有的一切是这样的:

[...]
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。这意味着阿尔法分量的第一的,不会持续太久,在你的形象,所以你要的0您alphaAtX:y:功能的alpha分量的偏移。

是否有任何的帮助?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top