我创建了一个这样的上下文(简化):
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); CGContextRef context = CGBitmapContextCreate (bitmapData, pixWide, pixHeigh, 8, // bits per component bitmapBytesPerRow, colorSpace, kCGImageAlphaPremultipliedFirst);
现在,当我尝试使用Alphatransparency为我的PNG中的第一个像素提取数据时,它有非常奇怪的alpha值.我有一个简单的PNG,它是一个正方形.在每个边缘上,我切掉了10x10像素,使它们完全透明.阿尔法不应该像153那样.
在CGImage.h中声明了一个kCGImageAlphaOnly.医生说:
kCGImageAlphaOnly没有颜色数据,只有alpha通道.
好吧,这实际上听起来不错,因为我只需要Alpha数据,而不需要其他任何东西.但这引起了我脑海中的一些问号.如果我有一个装备齐全的PNG,有一堆颜色+ alpha:这是否会确保我的PNG转换为匹配该颜色空间?或者我是否必须提供与指定颜色空间匹配的PNG?
编辑:我尝试使用kCGImageAlphaOnly,但是我收到此错误:
: CGBitmapContextCreate: unsupported parameter combination: 8 integer bits/component; 24 bits/pixel; 0-component colorspace; kCGImageAlphaOnly; 55 bytes/row.
这可能是什么问题?我之前指定了这个:
size_t pixelsWide = CGImageGetWidth(inImage); size_t pixelsHigh = CGImageGetHeight(inImage); bitmapBytesPerRow = (pixelsWide * 1); // not * 4, because I just want alpha bitmapByteCount = (bitmapBytesPerRow * pixelsHigh);
编辑:我一分钟前读过这篇文章:
添加到XCode的PNG在编译期间通过'pngcrush'进行优化.这会进行一些字节交换(从RGBA到BRGA)和alpha的预乘.
我认为这种alpha的预乘会会带来麻烦.
编辑:在pngcrunch对PNG进行字节交换之后,alpha通道保持不变.因为我不关心颜色,只是alpha,我认为预乘不应该是一个太大的问题.
我的PNG已经是24位PNG,我将它们添加到Xcode中.
你不能这样做:
bitmapBytesPerRow = (pixelsWide * 1); // not * 4, because I just want alpha
您正在调用的函数将始终返回所有图像数据.该kCGImageAlphaOnly
常数被用来告诉你,图像仅包含一个alpha通道,没有颜色信息.
你需要使用pixelsWide * 4
bytesPerRow.另请注意,CGBitmapContextCreate()的bitmapData参数用于显式提供存储空间,而不是为您绘制存储空间.
可能你要做的就是这个(未经测试的代码,只需从内存中输入):
CGImageRef image = GetMyImageFromWhereverItIs(); CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB(); CGContextRef ctx = CGBitmapContextCreate( NULL, CGImageGetWidth(image), CGImageGetHeight(image), CGImageGetBitsPerComponent(image), CGImageGetBytesPerRow(image), space, kCGBitmapByteOrderDefault | kCGImageAlphaLast ); CGColorSpaceRelease( space ); // now draw the image into the context CGRect rect = CGRectMake( 0, 0, CGImageGetWidth(image), CGImageGetHeight(image) ); CGContextDrawImage( ctx, rect, image ); UInt32 * pixels = CGBitmapContextGetData( ctx ); // now we can iterate through the data & read the alpha values int i, count = CGBitmapContextGetBytesPerRow(ctx) * CGBitmapContextGetHeight(ctx); for ( i = 0; i < count; i++ ) { UInt8 alpha = pixels[i] & 0x000000ff; // do with the alpha what you will }