Frage

ich eine PNG-Bild, das einen nicht unterstützten Bitmap-Grafikkontext Pixelformat hat. Jedes Mal, wenn ich versuche, das Bild, CGBitmapContextCreate() würgt auf das nicht unterstützte Format, um die Größe

ich die folgende Fehlermeldung (Fehler für eine einfache Lesung formatiert):

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

Die Liste der unterstützten Pixelformate definitiv nicht diese Kombination nicht unterstützt. Es scheint, ich brauche das Bild neu zu zeichnen und die Alpha-Kanal Informationen auf kCGImageAlphaPremultipliedFirst oder kCGImageAlphaPremultipliedLast .

Ich habe keine Ahnung, wie dies zu tun gehen.

Es ist nichts Ungewöhnliches über die PNG-Datei und es ist nicht beschädigt. Es funktioniert in allen anderen Kontext gut. Ich traf diesen Fehler nur durch Zufall, aber offensichtlich meine Benutzer in ähnliche Weise Dateien formatiert haben könnten, damit ich muß meinen App importierte Bilder und richtig für dieses Problem überprüfen.

War es hilfreich?

Lösung

Ja, hatte ich Probleme mit 8 Bit (indexiert) .PNGs. Ich hatte es zu einem nativen Bild zu konvertieren, um Grafikoperationen durchzuführen. Ich habe im Wesentlichen so etwas wie folgt aus:

- (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;    
}

Andere Tipps

Hier ist eine aktualisierte Version des Verfahrens von Alfons Antwort auf Konto für Bildgröße, und auch einige dumme Fehler mit Dezimalzahlen in Fließkommawerte der Bildgröße beschrieben, wie in unsynchronisierten Kommentar von der ursprünglichen Antwort.

SCREEN_SCALE ist ein Makro, dass die Renditen entweder 1,0, wenn Skala nicht definiert ist oder was auch immer das Gerät Skala ist eigentlich ([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;    
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top