2010-03-16 4 views
25

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

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

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

Le list of supported pixel formats ne certainement supporte pas cette combinaison. Il semble que je dois redessiner l'image et déplacer les informations de canal alpha à kCGImageAlphaPremultipliedFirst or kCGImageAlphaPremultipliedLast.

Je n'ai aucune idée de comment s'y prendre.

Il n'y a rien d'inhabituel au fichier PNG et il n'est pas corrompu. Cela fonctionne dans tous les autres contextes. J'ai rencontré cette erreur par hasard, mais il est évident que mes utilisateurs peuvent avoir des fichiers au format similaire, donc je vais devoir vérifier les images importées de mon application et corriger ce problème.

Répondre

56

Oui, j'avais des problèmes avec les .PNG 8 bits (indexés). J'ai dû le convertir en une image plus native pour effectuer des opérations graphiques. Je essentiellement fait 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;  
} 
+0

Ça me va, je vais essayer. Je déteste faire beaucoup de traitement parce que j'ai peur de détruire par inadvertance la fidélité. – TechZen

+0

J'ai finalement essayé de tester cela et cela fonctionne très bien, sans perte de fidélité perceptible. – TechZen

+0

J'ai un problème avec le code ci-dessus lorsque l'imageOrientation de l'UIImage est tout sauf OrientationUp - ceci provoque la rotation de l'image. Les limites de l'image restent les mêmes, mais les pixels à l'intérieur de l'image sont pivotés et étirés pour correspondre aux limites d'origine. Ceci est similaire à ce qui est décrit dans: http://stackoverflow.com/questions/5973105/image-clicked-from-iphone-in-portrait-mode-gets-rotated-by-90-degree mais dans ce cas c'est le normalise la fonction qui semble causer le problème. Quelqu'un d'autre voit cela? Une solution pour cela? – kurtzmarc

5

est ici 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 originale. SCREEN_SCALE est une macro qui renvoie 1.0 si l'échelle n'est pas définie ou quelle que soit l'échelle du périphérique ([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;  
} 
Questions connexes