Domanda

Ho un'immagine PNG che ha una grafica bitmap formato contesto di pixel non supportato. Ogni volta che tento di ridimensionare l'immagine, CGBitmapContextCreate() soffoca sul formato non supportato

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 elenco dei formati supportati pixel sicuramente non supportano questa combinazione. Sembra che ho bisogno di ridisegnare l'immagine e spostare le informazioni del canale alfa per kCGImageAlphaPremultipliedFirst o kCGImageAlphaPremultipliedLast .

Non ho idea di come fare per fare questo.

Non c'è nulla di insolito il file PNG e non è danneggiato. Funziona in tutti gli altri contesto più che bene. Ho incontrato questo errore solo per caso, ma, ovviamente, i miei utenti potuto simile file formattati in modo da dovrò controllare le immagini importate della mia app e corretto per questo problema.

È stato utile?

Soluzione

Si, ho avuto problemi con 8 bit .pngs (indicizzati). Ho dovuto convertirlo in un'immagine più nativo per eseguire le operazioni di grafica. 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;    
}

Altri suggerimenti

Ecco una versione aggiornata del metodo da Alfons risposta per tenere conto di dimensioni dello schermo, e anche alcuni errori stupidi con i 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 bilancia non è definito o qualsiasi altra cosa la scala dispositivo è in realtà ([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;    
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top