26

サポートされていないビットマップグラフィックスコンテキストピクセル形式のPNG画像があります。画像のサイズを変更しようとするとCGBitmapContextCreate()、サポートされていない形式でチョークします

次のエラーが表示されます(読みやすいようにフォーマットされたエラー)。

CGBitmapContextCreate: unsupported parameter combination: 
    8 integer bits/component; 
    32 bits/pixel; 
    3-component colorspace; 
    kCGImageAlphaLast; 
    1344 bytes/row.

サポートされているピクセル形式のリストは、この組み合わせを確実にサポートしていません。画像を再描画し、アルファチャネル情報をkCGImageAlphaPremultipliedFirstまたはkCGImageAlphaPremultipliedLastに移動する必要があるようです。

私はこれをどうやってやるのか分かりません。

PNGファイルに異常はなく、破損していません。他のすべてのコンテキストで問題なく機能します。このエラーは偶然に発生しましたが、明らかにユーザーが同様の形式のファイルを使用している可能性があるため、アプリのインポートされた画像を確認してこの問題を修正する必要があります。

4

2 に答える 2

59

ええ、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;    
}
于 2010-03-20T21:48:06.130 に答える
5

これは、画面スケールを考慮したAlfons Answerのメソッドの更新バージョンです。また、元の回答からの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;    
}
于 2012-02-20T22:47:55.407 に答える