Если все, что вам нужно, это альфа-значение одной точки, все, что вам нужно, это альфа-единственный одноточечный буфер. Я считаю, что этого должно быть достаточно:
// assume im is a UIImage, point is the CGPoint to test
CGImageRef cgim = im.CGImage;
unsigned char pixel[1] = {0};
CGContextRef context = CGBitmapContextCreate(pixel,
1, 1, 8, 1, NULL,
kCGImageAlphaOnly);
CGContextDrawImage(context, CGRectMake(-point.x,
-point.y,
CGImageGetWidth(cgim),
CGImageGetHeight(cgim)),
cgim);
CGContextRelease(context);
CGFloat alpha = pixel[0]/255.0;
BOOL transparent = alpha < 0.01;
Если UIImage не нужно воссоздавать каждый раз, это очень эффективно.
РЕДАКТИРОВАТЬ 8 декабря 2011 г .:
Комментатор указывает, что при определенных обстоятельствах изображение может быть перевернуто. Я думал об этом, и мне немного жаль, что я не написал код с использованием UIImage напрямую, как это (я думаю, причина в том, что в то время я не понимал о UIGraphicsPushContext
) :
// assume im is a UIImage, point is the CGPoint to test
unsigned char pixel[1] = {0};
CGContextRef context = CGBitmapContextCreate(pixel,
1, 1, 8, 1, NULL,
kCGImageAlphaOnly);
UIGraphicsPushContext(context);
[im drawAtPoint:CGPointMake(-point.x, -point.y)];
UIGraphicsPopContext();
CGContextRelease(context);
CGFloat alpha = pixel[0]/255.0;
BOOL transparent = alpha < 0.01;
Думаю, это решило бы проблему с переворотом.