10

私のアプリケーションでは、ローカルおよびオンラインに保存されているいくつかの画像のサイズを変更してトリミングする必要があります。を実装するTrevor Harmon のチュートリアルを使用していますUIImage+Resize

私の iPhone 4 (iOS 4.3.1) では、すべて問題なく動作します。問題はありません。しかし、私の iPhone 3G (iOS 3.2) では、サイズ変更とトリミングの方法がどの画像に対しても機能しません (ローカルに保存されているものは PNG です)。これはコンソール出力です:

Tue Apr  5 02:34:44 Andreis-MacBook-Pro.local Puzzle[12453] <Error>: CGBitmapContextCreate:     unsupported parameter combination: 8 integer bits/component; 32 bits/pixel; 3-component color space; kCGImageAlphaLast; 288 bytes/row.
Tue Apr  5 02:34:44 Andreis-MacBook-Pro.local Puzzle[12453] <Error>: CGBitmapContextCreate: unsupported parameter combination: 8 integer bits/component; 32 bits/pixel; 3-component color space; kCGImageAlphaLast; 288 bytes/row.
Tue Apr  5 02:34:44 Andreis-MacBook-Pro.local Puzzle[12453] <Error>: CGBitmapContextCreate: unsupported parameter combination: 8 integer bits/component; 32 bits/pixel; 3-component color space; kCGImageAlphaLast; 288 bytes/row.
Tue Apr  5 02:34:44 Andreis-MacBook-Pro.local Puzzle[12453] <Error>: CGBitmapContextCreate: unsupported parameter combination: 8 integer bits/component; 32 bits/pixel; 3-component color space; kCGImageAlphaLast; 288 bytes/row.

剪定方法はこちら

- (UIImage *)croppedImage:(CGRect)bounds 
{
    CGImageRef imageRef = CGImageCreateWithImageInRect([self CGImage], bounds);
    UIImage *croppedImage = [UIImage imageWithCGImage:imageRef];
    CGImageRelease(imageRef);
    return croppedImage;
}

サイズ変更方法は次のとおりです。

- (UIImage *)resizedImage:(CGSize)newSize
            transform:(CGAffineTransform)transform
       drawTransposed:(BOOL)transpose
 interpolationQuality:(CGInterpolationQuality)quality 
{
    CGRect newRect = CGRectIntegral(CGRectMake(0, 0, newSize.width, newSize.height));
    CGRect transposedRect = CGRectMake(0, 0, newRect.size.height, newRect.size.width);
    CGImageRef imageRef = self.CGImage;

    CGContextRef bitmap = CGBitmapContextCreate(NULL,
                                            newRect.size.width,
                                            newRect.size.height,
                                            CGImageGetBitsPerComponent(imageRef),
                                            0,
                                            CGImageGetColorSpace(imageRef),
                                            CGImageGetBitmapInfo(imageRef));
    if(bitmap == nil)
        return nil;

    CGContextConcatCTM(bitmap, transform);

    CGContextSetInterpolationQuality(bitmap, quality);

    CGContextDrawImage(bitmap, transpose ? transposedRect : newRect, imageRef);

    CGImageRef newImageRef = CGBitmapContextCreateImage(bitmap);
    UIImage *newImage = [UIImage imageWithCGImage:newImageRef];

    CGContextRelease(bitmap);
    CGImageRelease(newImageRef);

    return newImage;
}

誰かが私がこの問題を抱えている方法を説明できますか?

ありがとう、アンドレイ

4

5 に答える 5

24

このエラーが発生したときとまったく同じピクセル形式だったので、ここに返信します。この答えが誰かに役立つことを願っています。

私の場合、それが失敗した理由は、kCGImageAlphaLastiOS 7 では問題なく動作しますが、iOS 8 では許可されていないためです。32 pbb、8 bpc の組み合わせでは、Alpha Infoのみが許可kCGImageAlphaNoneSkip*されます。kCGImageAlphaPremultiplied*どうやらこれは常に問題でしたが、iOS 8 より前には強制されていませんでした。私の解決策は次のとおりです。

- (CGBitmapInfo)normalizeBitmapInfo:(CGBitmapInfo)oldBitmapInfo {
    //extract the alpha info by resetting everything else
    CGImageAlphaInfo alphaInfo = oldBitmapInfo & kCGBitmapAlphaInfoMask;

    //Since iOS8 it's not allowed anymore to create contexts with unmultiplied Alpha info
    if (alphaInfo == kCGImageAlphaLast) {
        alphaInfo = kCGImageAlphaPremultipliedLast;
    }
    if (alphaInfo == kCGImageAlphaFirst) {
        alphaInfo = kCGImageAlphaPremultipliedFirst;
    }

    //reset the bits
    CGBitmapInfo newBitmapInfo = oldBitmapInfo & ~kCGBitmapAlphaInfoMask;

    //set the bits to the new alphaInfo
    newBitmapInfo |= alphaInfo;

    return newBitmapInfo;
}

私の場合、失敗したコードは次のようになりました。ここで、imageRef はアプリ バンドルから読み込まれた PNG の CGImageRef です。

CGContextRef bitmap = CGBitmapContextCreate(NULL,
                                                newRect.size.width,
                                                newRect.size.height,
                                                CGImageGetBitsPerComponent(imageRef),
                                                0,
                                                CGImageGetColorSpace(imageRef),
                                                CGImageGetBitmapInfo(imageRef));

ソース: https://stackoverflow.com/a/19345325/3099609

https://developer.apple.com/library/mac/DOCUMENTATION/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_context/dq_context.html#//apple_ref/doc/uid/TP30001066-CH203-BCIBHHBB

于 2014-10-14T16:00:45.900 に答える
5

色空間に問題があることがわかりました。CGImageGetColorSpace(imageRef) を CGColorSpaceCreateDeviceRGB() に置き換えるだけです。これは、AVCaptureSession から取得した画像を保存しようとするときに機能します。そして、それを解放することを忘れないでください!

CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef bitmap = CGBitmapContextCreate(NULL,
                                            newRect.size.width,
                                            newRect.size.height,
                                            CGImageGetBitsPerComponent(imageRef),
                                            0,
                                            rgbColorSpace,//CGImageGetColorSpace(imageRef), sometimes contains unsupported colorspace
                                            bitmapInfo);
CGColorSpaceRelease(rgbColorSpace);
于 2011-12-10T08:12:46.237 に答える
3

iOS 5 シミュレーターで同じ問題が発生しましたが、上記の回答では問題が解決しませんでした。画像が読み込まれず、コンソールでも同じエラーが報告されました。

ここにある非常に人気のあるカテゴリを使用しています

このブログでは、人々が同じ問題を抱えています。2011 年 11 月 22 日の Matt の回答が役に立ちました。

乾杯!

于 2013-06-11T08:30:01.420 に答える
3

わかりましたこれはあなたを助けるかもしれませんし、助けないかもしれません(そしてこれが古い投稿であることを感謝します)

width パラメーター (あなたの場合は newRect.size.width) に小数部分 (たとえば、100.0 ではなく 100.001) があったため、同様の問題が発生していました。私はそれを整数に型キャストして戻し、小数部分を切り捨て、問題は解決しました。コンポーネントあたりのビット数 x ピクセルなどが加算されることを確認するテストがあり、小数のピクセル/ポイントを処理できないと推測しています。この方法が役立つ場合は、この方法を使用してください。

+(CGSize)  fixSize:(CGSize) forSize{
    NSInteger w = (NSInteger) forSize.width;
    NSInteger h = (NSInteger) forSize.height;
    return CGSizeMake(w, h);
}
于 2011-10-23T20:30:37.483 に答える
0

テストのために 5.1 から 6.1 に切り替えると、シミュレーターでこの問題が発生しました。シミュレーターを閉じて再度開くと、エラーが解消されたようです。

于 2013-08-17T18:37:45.790 に答える