【发布时间】:2012-08-16 13:14:16
【问题描述】:
我有 Apple iOS 优化的 BGRA PNG 格式的 PNG(我使用 OptimizedPNG 得到的),并希望以一种告诉 CoreGraphics 不要忽略图像的 alpha 分量的方式绘制它们。我正在向drawRect: 中的CGContextRef 绘图
编辑:渲染图像在应该完全透明的地方显示为黑色(有时是其他随机伪影)。不透明区域正常渲染。
CGImageAlphaInfo 我从图片中得到的是kCGImageAlphaNoneSkipLast,似乎表明 OptimizedPNG 保存图片的方式存在问题。我想这应该是kCGImageAlphaPremultipliedLast。
也许 PNG 块是错误的,但我看不出 IHDR 有什么问题,而且我几乎找不到关于 CgBI 块的信息。
这是 OptimizedPNG 保存颜色数据的方式:
// IDAT
int size = width*height*4;
unsigned char *buffer = malloc(size);
CGContextRef context = CGBitmapContextCreate(buffer, width, height, 8, width*4, CGImageGetColorSpace(originalImage.CGImage), kCGImageAlphaPremultipliedLast);
CGRect rect = CGRectMake(0.0, 0.0, (CGFloat)width, (CGFloat)height);
CGContextDrawImage(context, rect, originalImage.CGImage);
CGContextRelease(context);
int size_line = 1 + width*4;
int size_in = height*size_line;
unsigned char *buffer_in = malloc(size_in);
for(int y = 0; y < height; ++y){
unsigned char *src = &buffer[y*width*4];
unsigned char *dst = &buffer_in[y*size_line];
*dst++ = 1;
unsigned char r = 0, g = 0, b = 0, a = 0;
for(int x = 0; x < width; ++x){
dst[0] = src[2] - b;
dst[1] = src[1] - g;
dst[2] = src[0] - r;
dst[3] = src[3] - a;
r = src[0], g = src[1], b = src[2], a = src[3];
src += 4;
dst += 4;
}
}
【问题讨论】:
-
Core Graphics 尊重图像的 alpha 通道,如果它有的话。 Core Graphics 透明层实际上与图像 alpha 几乎没有关系。请发布您获得的结果的屏幕截图,并描述您希望它有何不同。
-
@robmayoff 编辑了更多信息。
标签: ios core-graphics cgcontext alpha-transparency premultiplied-alpha