2010-03-16 17 views
25

Ho un'immagine PNG con un formato pixel di contesto grafico bitmap non supportato. Ogni volta che tento di ridimensionare l'immagine, CGBitmapContextCreate() soffoca sul formato non supportatoiPhone: modifica di CGImageAlphaInfo di CGImage

ricevo il seguente errore (errore formattato per una facile lettura):

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

Il list of supported pixel formats sicuramente non supporta questa combinazione. Sembra che sia necessario ridisegnare l'immagine e spostare le informazioni del canale alfa su kCGImageAlphaPremultipliedFirst or kCGImageAlphaPremultipliedLast.

Non ho idea di come procedere.

Non c'è niente di insolito nel file PNG e non è danneggiato. Funziona perfettamente in tutti gli altri contesti. Ho riscontrato questo errore solo per caso, ma ovviamente i miei utenti potrebbero avere file formattati in modo simile, quindi dovrò controllare le immagini importate dalla mia app e correggere questo problema.

risposta

56

Sì, ho avuto problemi con 8PNG (indicizzati). Ho dovuto convertirlo in un'immagine più nativa per eseguire operazioni grafiche. Ho in sostanza fatto qualcosa di simile:

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

Sembra buono, ci proverò. Sono disgustoso di fare troppe elaborazioni perché temo di distruggere inavvertitamente la fedeltà. – TechZen

+0

Alla fine sono riuscito a testarlo e funziona perfettamente senza perdite di fedeltà visibili. – TechZen

+0

Sto riscontrando un problema con il codice sopra quando l'imageOrientation di UIImage è tutto tranne OrientationUp - questo fa ruotare l'immagine. I limiti dell'immagine rimangono gli stessi, ma i pixel all'interno dell'immagine vengono ruotati e allungati per adattarsi ai limiti originali. Questo è simile a quanto descritto in: http://stackoverflow.com/questions/5973105/image-clicked-from-iphone-in-portrait-mode-gets-rotated-by-90-degree ma in questo caso è il normalizzare la funzione che sembra causare il problema. Qualcun altro lo vede? Qualche correzione per questo? – kurtzmarc

5

Ecco una versione aggiornata del metodo da Alfons risposta per tenere conto di dimensioni dello schermo, e anche alcuni errori sciocchi con decimali in valori in virgola mobile delle dimensioni dell'immagine, come descritto nel commento di non sincronizzato dalla risposta originale

SCREEN_SCALE è una macro che restituisce 1.0 se la scala non è definita o qualunque sia la scala del dispositivo effettivamente ([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;  
} 
Problemi correlati