RGBA形式のPNGファイルロード時の実機とシミュレーターの違い(kCGImageAlphaPremultipliedLastとkCGImageAlphaLast)
[32ビットピクセル、8ビットRGBAコンポーネント]形式のPNGファイルをロードすると、実機とシミュレーターではCGImageGetAlphaInfo()の返り値が異なる。
CGImageRef image = [UIImage imageNamed:@"PNG画像パス"].CGImage; NSLog(@"width:%lu height:%lu bpc:%lu bpr:%lu cs:%p alpha:%lu" ,filename ,CGImageGetWidth(image) ,CGImageGetHeight(image) ,CGImageGetBitsPerComponent(image) ,CGImageGetBytesPerRow(image) ,CGImageGetColorSpace(image) ,(size_t)CGImageGetAlphaInfo(image) );
種別 | alphaInfo |
---|---|
シミュレーター | kCGImageAlphaLast |
実機 | kCGImageAlphaPremultipliedLast |
kCGImageAlphaLastは、CGBitmapContextCreateでサポートされていないため、CGImageGetAlphaInfo()を使ってCGBitmapContextCreate()を実行すると、シミュレーターではランタイムで以下のようなエラーがログ出力される。
: CGBitmapContextCreate: unsupported parameter combination: 8 integer bits/component; 32 bits/pixel; 3-component color space; kCGImageAlphaLast; 2048 bytes/row.
実機の動作にシミュレーターを会わせて欲しいものだが、仕方ない。
サポートされていないkCGImageAlphaLastと判断された場合、kCGImageAlphaPremultipliedLastとして扱ってしまうことで画像を取り扱うことができる。