2016-09-26 2 views
2

Ich versuche, Kacheln für ein größeres Bild zu erstellen, und es scheint, dass ab IOS 10 der folgende Code nicht mehr funktioniert und mit EXC_BAD_ACCESS abstürzt.CGImageDestinationFinalize oder UIImageJPEGRepräsentation - Absturz beim Speichern einer großen Datei auf IOS 10

Dies passiert nur auf IOS 10 Gerät, IOS 9 funktioniert gut.

Der Absturz passiert mit jedem Bild, das größer als ~ 1300x1300 ist.

Profiling in Instrumenten ergibt nichts Interessantes und zeigt auf CGImageDestinationFinalize.

Es gibt keine Speicherspitze.

habe ich versucht, in beide Richtungen unter:

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

ODER

+ (BOOL) CGImageWriteToFile: (CGImageRef) image andPath: (NSString *)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); 

Wie ich es UIImageJPEGRepresentation wiederum verstehen schließlich CGImageDestinationFinalize nennt.

Edit: vergessen zu erwähnen, die Bilder sind auf Festplatte geschrieben, aber etwa auf halbem Weg.

Das scheint wirklich etwas mit IOS 10 zu tun, könnte das ein Fehler sein?

Ich habe auch den Fehler mit Apple nur für den Fall abgelegt.

Jede Hilfe oder Workarounds zum Schreiben von großen Bildern wird sehr geschätzt.

+0

* Könnte das ein Fehler sein? * Wenn Sie das jemals fragen, [nur Datei eins] (http://bugreport.apple.com). Fragen Sie auch SO, wenn Sie nach einer zusätzlichen Bestätigung/Hilfe/Problemumgehung suchen, aber trotzdem einen Fehler melden. – rickster

+0

Fehler eingereicht. Jede Hilfe mit Workarounds wird geschätzt –

Antwort

3

ich meine eigene Frage stellen werde hier beantworten.

Was ich gesammelt habe, ist, dass IOS 10 Probleme beim Speichern einer Datei mit dem Farbmodus "Graustufen" hat.

Also, wenn Sie

UIImageJPEGRepresentation(tempImage, 0.8f) 

tun, und wenn TempImage ist Graustufen- Sie einen Absturz bekommen.

Ich habe viele Bilder verarbeitet und es hat erst später geklickt, dass es mit dem Farbmodus des Bildes zusammenhängen könnte.

Ich habe bereits einen Fehler mit Apple eingereicht, um zu sehen, was sie sagen, aber in der Zwischenzeit musste ich eine temporäre Lösung finden.

Meine Lösung war, Bild in RGB zu konvertieren, indem Sie es zeichnen und in ein neues Bild einfangen.

Probenmethode:

+ (UIImage *)convertImage:(UIImage *)sourceImage 
{ 
    UIGraphicsBeginImageContext(sourceImage.size); 
    [sourceImage drawInRect:CGRectMake(0, 0, sourceImage.size.width, sourceImage.size.height)]; 

    UIImage *targetImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return targetImage; 
} 

Hoffentlich hilft dies jemand.

+0

Es hilft nicht auf meinem Testbild. – jiangjiefs

+0

https://drive.google.com/file/d/1ffMzwWl7Zik9u7_SYaBqeWEO_ibH-PiS/view?usp=sharing – jiangjiefs

0
  1. ist einer der Parameter, die Sie an UIImageJPEGRepresentation übergeben haben; Wenn es auf ein totes Objekt zeigt, führt dies zu einem Absturz, wenn UIImageJPEGRepresentation versucht, dieses tote Objekt zu verwenden. Überprüfen Sie, ob tempImage Null ist.
  2. überprüfen, ob Sie Bild hinzufügen, nachdem CGImageDestinationFinalize am Bestimmungsort
+0

Vielen Dank für Ihre Antwort. tempimage ist nicht null. Wie ich in der Frage erwähnt habe, passiert es nur, wenn das Bild größer als 1400x1400 ist. Und das resultierende Bild wird auf HDD geschrieben, aber auf halbem Weg. :( –

Verwandte Themen