iPhone:CGImageのCGImageAlphaInfoの変更
-
20-09-2019 - |
質問
サポートされていないビットマップ グラフィックス コンテキスト ピクセル形式の PNG 画像があります。画像のサイズを変更しようとすると、 CGBitmapContextCreate()
サポートされていない形式ではチョークします
次のエラーが表示されます (エラーは読みやすいようにフォーマットされています)。
CGBitmapContextCreate: unsupported parameter combination:
8 integer bits/component;
32 bits/pixel;
3-component colorspace;
kCGImageAlphaLast;
1344 bytes/row.
の サポートされているピクセル形式のリスト この組み合わせは間違いなくサポートされていません。画像を再描画し、アルファ チャネル情報を次の場所に移動する必要があるようです。 kCGImageAlphaPremultipliedFirst または kCGImageAlphaPremultipliedLast.
これをどうやってやればいいのか分かりません。
PNG ファイルには何も異常はなく、破損していません。他のすべてのコンテキストでは問題なく機能します。私がこのエラーに遭遇したのは偶然ですが、明らかにユーザーが同様の形式のファイルを持っている可能性があるため、アプリのインポートされた画像を確認してこの問題を修正する必要があります。
解決
そうですね、8 ビット (インデックス付き) .PNG で問題が発生しました。グラフィックス操作を実行するには、それをよりネイティブな画像に変換する必要がありました。私は基本的に次のようなことをしました:
- (UIImage *) normalize {
CGColorSpaceRef genericColorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef thumbBitmapCtxt = CGBitmapContextCreate(NULL,
self.size.width,
self.size.height,
8, (4 * self.size.width),
genericColorSpace,
kCGImageAlphaPremultipliedFirst);
CGColorSpaceRelease(genericColorSpace);
CGContextSetInterpolationQuality(thumbBitmapCtxt, kCGInterpolationDefault);
CGRect destRect = CGRectMake(0, 0, self.size.width, self.size.height);
CGContextDrawImage(thumbBitmapCtxt, destRect, self.CGImage);
CGImageRef tmpThumbImage = CGBitmapContextCreateImage(thumbBitmapCtxt);
CGContextRelease(thumbBitmapCtxt);
UIImage *result = [UIImage imageWithCGImage:tmpThumbImage];
CGImageRelease(tmpThumbImage);
return result;
}
他のヒント
これは、画面スケールを考慮したAlfonsの回答からのメソッドの更新バージョンであり、元の回答のunsynchronizedのコメントで説明されているように、画像サイズの浮動小数点値の小数点に関する愚かなエラーもいくつかあります。
SCREEN_SCALE は、スケールが定義されていない場合は 1.0、または実際のデバイス スケール ([UIScreen mainScreen].scale) を返すマクロです。
- (UIImage *) normalize {
CGSize size = CGSizeMake(round(self.size.width*SCREEN_SCALE), round(self.size.height*SCREEN_SCALE));
CGColorSpaceRef genericColorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef thumbBitmapCtxt = CGBitmapContextCreate(NULL,
size.width,
size.height,
8, (4 * size.width),
genericColorSpace,
kCGImageAlphaPremultipliedFirst);
CGColorSpaceRelease(genericColorSpace);
CGContextSetInterpolationQuality(thumbBitmapCtxt, kCGInterpolationDefault);
CGRect destRect = CGRectMake(0, 0, size.width, size.height);
CGContextDrawImage(thumbBitmapCtxt, destRect, self.CGImage);
CGImageRef tmpThumbImage = CGBitmapContextCreateImage(thumbBitmapCtxt);
CGContextRelease(thumbBitmapCtxt);
UIImage *result = [UIImage imageWithCGImage:tmpThumbImage scale:SCREEN_SCALE orientation:UIImageOrientationUp];
CGImageRelease(tmpThumbImage);
return result;
}