我有 Apple iOS 优化的 BGRA PNG 格式的 PNG(我使用OptimizedPNG得到的),并希望以一种告诉 CoreGraphics 不要忽略图像的 alpha 分量的方式绘制它们。我正在画CGContextRef
一个drawRect:
编辑:渲染的图像在应该完全透明的地方显示为黑色(有时是其他随机伪影)。不透明区域正常渲染。
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;
}
}