我正在尝试使用以下代码从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数据。关于代码有什么问题的任何想法?
答案 0 :(得分:2)
首先,你正在泄漏内存,像素数据内存永远不会被释放。
对于您的使用,最好让CGContext调用管理内存。只需传递NULL i.s.o. pixelData,只要您在上下文中保持引用计数,CGBitmapContextGetData(context)
将保持有效。
您正在使用alpha,就好像它是最后一个条目(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,已经是朝着正确方向迈出的一步。
答案 1 :(得分:0)
首先,我会检查您的CGBitmapContextCreate
调用返回的上下文是否有效(即确保context != NULL
)。我还会检查以确保您最初加载的图片有效(因此,请确保img != nil
)。
如果您的上下文为零,则可能是因为您的图片大小不合理,或者您的像素数据格式不可用。请尝试使用kCGImageAlphaPremultipliedLast
代替?
其次,您不需要使用CGBitmapContextGetData
- 您可以首先使用您传入的pixelData
指针。在离开CGContextRelease
函数之前,您还应该initWithImage:
您的上下文以避免泄漏。
我还注意到您正在使用kCGImageAlphaPremultipliedFirst
。这意味着图像中的alpha分量 first 而不是最后一个,因此您希望alphaAtX:y:
函数中的alpha分量偏移为0。
有没有帮助?