Apple の iOS に最適化された BGRA PNG 形式 ( OptimizedPNGを使用して取得したもの) の PNG があり、CoreGraphics に画像のアルファ コンポーネントを無視しないように指示する方法でそれらを描画したいと考えています。私はに描いていCGContextRef
ますdrawRect:
編集:レンダリングされた画像は、完全に透明であるべき場所が黒く表示されます(他のランダムなアーティファクトがある場合があります)。不透明な領域は正常にレンダリングされます。
これCGImageAlphaInfo
は、OptimizedPNG による画像の保存方法に問題があることを示しているようです。これはあるべきだと思います。kCGImageAlphaNoneSkipLast
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;
}
}