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として扱ってしまうことで画像を取り扱うことができる。