我目前正在尝试获取UIImageView中像素的alpha值。我从CGImage映像中获得了UIImageView,并由此创建了一个RGBA字节数组。阿尔法是预乘的。
CGImageRef image = uiImage.CGImage;
NSUInteger width = CGImageGetWidth(image);
NSUInteger height = CGImageGetHeight(image);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
rawData = malloc(height * width * 4);
bytesPerPixel = 4;
bytesPerRow = bytesPerPixel * width;
NSUInteger bitsPerComponent = 8;
CGContextRef context = CGBitmapContextCreate(
rawData, width, height, bitsPerComponent, bytesPerRow, colorSpace,
kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big
);
CGColorSpaceRelease(colorSpace);
CGContextDrawImage(context, CGRectMake(0, 0, width, height), image);
CGContextRelease(context);然后,使用来自UIImageView的坐标计算给定alpha通道的数组索引。
int byteIndex = (bytesPerRow * uiViewPoint.y) + uiViewPoint.x * bytesPerPixel;
unsigned char alpha = rawData[byteIndex + 3];然而,我没有得到我所期望的价值。对于图像的一个完全黑色的透明区域,我得到α通道的非零值。我需要翻译UIKit和核心图形之间的坐标吗?也就是说:y轴是倒转的吗?还是我误解了乘以前的α值?
更新:
@Nikolai的建议是关键。事实上,我不需要在UIKit坐标和核心图形坐标之间进行转换。但是,在设置混合模式之后,我的alpha值达到了我的预期:
CGContextSetBlendMode(context, kCGBlendModeCopy);发布于 2009-06-25 09:57:43
是的,CGContexts的y轴是向上的,而在UIKit中它是向下的.看医生。
阅读代码后的编辑:
您还希望在绘制图像之前将混合模式设置为替换,因为您希望图像的alpha值,而不是之前在上下文缓冲区中的值:
CGContextSetBlendMode(context, kCGBlendModeCopy);思考后的编辑:
通过构建最小的可能的 (1x1像素),您可以更高效地查找?也许是8x8?)并在绘制之前将上下文翻译到您想要的位置:
CGContextTranslateCTM(context, xOffset, yOffset);https://stackoverflow.com/questions/1042830
复制相似问题