Question

J'ai une image PNG qui a un format pixel non pris en charge contexte graphique bitmap. Chaque fois que je tente de redimensionner l'image, CGBitmapContextCreate() selfs sur le format non supporté

Je reçois l'erreur suivante (erreur formatée pour faciliter la lecture):

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

liste des formats de pixels pris en charge ne prend pas en charge définitivement cette combinaison. Il semble que je dois redessiner l'image et déplacer les informations de canal alpha kCGImageAlphaPremultipliedFirst ou kCGImageAlphaPremultipliedLast .

Je ne sais pas comment s'y prendre.

Il n'y a rien d'inhabituel dans le fichier PNG et il est pas corrompu. Il fonctionne dans tous les autres contexte très bien. Je rencontrais cette erreur par hasard mais il est évident que mes utilisateurs ont peut-être des fichiers au format de la même façon que je vais devoir vérifier les images importées de mon application et corriger ce problème.

Était-ce utile?

La solution

Oui, j'ai eu des problèmes avec 8 bits (indexés) .PNGs. Je devais le convertir en une image plus native pour effectuer des opérations graphiques. Je l'ai fait essentiellement quelque chose comme ceci:

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

Autres conseils

Voici une version mise à jour de la méthode de Alfons réponse à compte échelle de l'écran, et aussi quelques erreurs stupides avec décimales dans les valeurs à virgule flottante de la taille de l'image comme décrit dans le commentaire de désynchronisé de la réponse initiale.

SCREEN_SCALE est une macro qui retourne soit 1,0 si l'échelle est pas défini ou quelle que soit l'échelle de l'appareil est en fait ([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;    
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top