3 回答
TA贡献1798条经验 获得超3个赞
如果你想要的只是单个点的alpha值,你只需要一个只有alpha的单点缓冲区。我相信这应该足够了:
// 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,这非常有效。
编辑2011年12月8日:
一位意见提供者指出,在某些情况下,图像可能会被翻转。我一直在考虑这个,我有点遗憾,我没有直接使用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;
我认为这样可以解决翻转问题。
TA贡献1828条经验 获得超3个赞
我是否需要翻译UIKit和Core Graphics之间的坐标 - 即:y轴是倒置的吗?
这是可能的。在CGImage中,像素数据采用英语阅读顺序:从左到右,从上到下。所以,阵列中的第一个像素是左上角; 第二个像素是从顶行左侧开始的一个像素; 等等
假设你有这个权利,你还应该确保你在一个像素内查看正确的组件。也许你期待RGBA但要求ARGB,反之亦然。或者,也许您的字节顺序错误(我不知道iPhone的字节顺序是什么)。
或者我误解了预乘alpha值?
听起来不像。
对于那些不知道的人:预乘意味着颜色分量被alpha预乘; 无论颜色分量是否被预乘,alpha分量都是相同的。您可以通过将颜色分量除以alpha来反转此(非预乘)。
- 3 回答
- 0 关注
- 823 浏览
添加回答
举报