2010-03-16 10 views
25

Ich habe ein PNG-Bild, das ein nicht unterstütztes Bitmap-Grafikkontextpixelformat hat. Jedes Mal, wenn ich versuche, die Größe des Bildes, Drosseln CGBitmapContextCreate() auf dem nicht unterstützten FormatiPhone: Ändern von CGImageAlphaInfo von CGImage

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 list of supported pixel formats definitiv nicht diese Kombination nicht unterstützt. Es scheint, dass ich das Bild neu zeichnen muss und die Alphakanalinformation zu kCGImageAlphaPremultipliedFirst or kCGImageAlphaPremultipliedLast verschieben muss.

Ich habe keine Ahnung, wie man das macht.

Es gibt nichts Ungewöhnliches an der PNG-Datei und es ist nicht beschädigt. Es funktioniert in jedem anderen Kontext gut. Ich bin zufällig auf diesen Fehler gestoßen, aber offensichtlich haben meine Benutzer ähnlich formatierte Dateien, daher muss ich die importierten Bilder meiner App überprüfen und das Problem beheben.

Antwort

56

Ja, ich hatte Probleme mit 8 Bit (indiziert). PNGs. Ich musste es in ein nativeres Bild umwandeln, um Grafikoperationen durchzuführen. Ich habe im Wesentlichen so etwas wie dieses:

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

Sieht gut aus, ich werde es versuchen. Ich verabscheue zu viel Verarbeitung, weil ich befürchte, dass ich die Treue versehentlich zerstören werde. – TechZen

+0

Ich kam schließlich dazu, dies zu testen und es funktioniert gut ohne erkennbaren Verlust der Wiedergabetreue. – TechZen

+0

Ich habe ein Problem mit dem obigen Code, wenn die imageOrientation des UIImage alles außer OrientationUp ist - das bewirkt, dass das Bild gedreht wird. Die Grenzen des Bildes bleiben gleich, aber die Pixel im Bild werden gedreht und gestreckt, um den ursprünglichen Grenzen zu entsprechen. Dies ist ähnlich wie beschrieben in: http://stackoverflow.com/questions/5973105/image-clicked-from-iphone-in-portrait-mode-gets-rotated-by-90-degree, aber in diesem Fall ist es die Normalisieren Sie die Funktion, die das Problem verursacht. Sieht das jemand anderes? Irgendeine Reparatur dafür? – kurtzmarc

5

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

SCREEN_SCALE ist ein Makro, das entweder 1,0 zurückgibt, wenn die Skalierung nicht definiert ist, oder was auch immer die Geräteskala tatsächlich ist ([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;  
}