CGImageDestinationFinalize ou UIImageJPEGRepresentation – Crash lors de l'logging d'un file volumineux sur IOS 10

J'essaye de créer des tuiles pour une plus grande image, et il semble que de l'IOS 10 le code suivant ne fonctionne plus et se bloque avec EXC_BAD_ACCESS.

Cela se produit uniquement sur IOS 10 Device, IOS 9 fonctionne très bien.

Le crash se produit avec n'importe quelle image qui est plus grande que ~ 1300×1300.

Le profilage des instruments ne donne rien d'intéressant et pointe vers CGImageDestinationFinalize.

Il n'y a pas de pic de memory.

J'ai essayé les deux façons ci-dessous:

UIImage* tempImage = [UIImage imageWithCGImage:tileImage]; NSData* imageData = UIImageJPEGRepresentation(tempImage, 0.8f); // CRASH HERE. 

OU

 + (BOOL) CGImageWriteToFile: (CGImageRef) image andPath: (NSSsortingng *)path { CFURLRef url = (__bridge CFURLRef)[NSURL fileURLWithPath:path]; CGImageDestinationRef destination = CGImageDestinationCreateWithURL(url, kUTTypeJPEG, 1, NULL); if (!destination) { NSLog(@"Failed to create CGImageDestination for %@", path); return NO; } CGImageDestinationAddImage(destination, image, nil); if (!CGImageDestinationFinalize(destination)) { // CRASH HERE NSLog(@"Failed to write image to %@", path); CFRelease(destination); return NO; } CFRelease(destination); 

Comme je le comprends, UIImageJPEGRepresentation appelle à son tour CGImageDestinationFinalize finalement.

Edit: J'ai oublié de mentionner que les images sont écrites en hdd, mais à mi-path.

Cela ressemble vraiment à quelque chose à faire avec IOS 10, cela pourrait-il être un bug?

J'ai également déposé le bug avec apple juste au cas où.

Toute aide ou contournement sur la façon d'écrire de grandes images est grandement appréciée.

Je vais répondre à ma propre question ici.

Ce que j'ai compris est que IOS 10 a du mal à sauvegarder un file qui a le mode couleur " niveaux de gris ".

Donc si vous faites

 UIImageJPEGRepresentation(tempImage, 0.8f) 

et si tempImage est en niveaux de gris, vous obtiendrez un plantage.

Je travaillais beaucoup d'images et il n'a pas cliqué plus tard que cela pourrait être lié au mode couleur de l'image.

J'ai déjà déposé un bug avec apple pour voir ce qu'ils disent, mais en attendant je devais find une solution temporaire.

Mon but était de convertir l'image en RVB en la dessinant et en la capturant dans une nouvelle image.

Méthode d'échantillon:

 + (UIImage *)convertImage:(UIImage *)sourceImage { UIGraphicsBeginImageContext(sourceImage.size); [sourceImage drawInRect:CGRectMake( 0, 0, sourceImage.size.width, sourceImage.size.height)]; UIImage *targetImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return targetImage; } 

Espérons que cela aide quelqu'un.

  1. tempimage est l'un des parameters que vous avez transmis à UIImageJPEGRepresentation ; si elle pointe vers un object mort, cela provoquera un plantage lorsque UIImageJPEGRepresentation d'utiliser cet object mort. vérifier si tempImage est nul.
  2. vérifier si vous ajoutez une image après avoir appelé CGImageDestinationFinalize à destination