iOS: CGImageCreateWith [PNG oder JPEG] DataProvider verursacht einen Segmentierungsfehler

8

Ich stehe vor einem seltsamen Problem. Ich entwickle ein iOS-Befehlszeilen-Barcode-Scanner-Dienstprogramm mit libzbar (ja, das ist für Jailbreak-Geräte). Alles geht gut, außer wenn ich versuche, die Methoden CGImageCreateWithPNGDataProvider() oder CGImageCreateWithJPEGDataProvider() zu verwenden, um eine CGImageRef von einer Datei zu erhalten - weil diese beiden Funktionen einen segfault auf meinem 5.1.1 iPad auslösen. Das Problem liegt nicht in meiner benutzerdefinierten Klasse ZBarScanner , denn wenn ich ein UIImage verwende, um die Bilddaten zu erhalten, benutze etwas wie

%Vor%

dann funktioniert es gut und druckt die Daten im Barcode gespeichert. Außerdem sind die PNG- und JPEG-Bilder gut formatiert - ich kann sie mit einem Dateibrowser auf dem Gerät selbst betrachten und habe auch mehrere andere Bilder ausprobiert. Ich habe sogar versucht, alle CFRelease() -Funktionsaufrufe und release -Nachrichten wegzulassen, um zu vermeiden, hängende Zeiger zu haben. Hier ist mein Code:

%Vor%

Wenn ich es im Debugger starte (GDB und NSLog Clutter zur besseren Übersicht entfernt):

%Vor%

Also selbst das Backtrace zeigt nichts offensichtlich falsch / hilfreich ... Es scheint aber, dass etwas ist NULL irgendwo . Ich habe sogar vermutet, dass diese Funktionen nicht in iOS 5.1.1 verfügbar sind, da meine Toolchain eine inoffizielle 4.0-basierte Version ist. Daher ist der Build erfolgreich, da sich die CGImageCreateWith[...]DataProvider -Symbole im Entwicklung -Sysroot befinden aber nicht unter den tatsächlichen dynamischen Bibliotheken von iOS, aber wenn das der Fall wäre, wäre der Funktionszeiger I NSLogged NULL , richtig? Jedoch scheinen weder die NS- und CG-Objekte noch die Funktionen NULL zu sein - der einzige NULL, den ich an die CGImage-Konstruktoren übergebe, ist ein decodeArray -Parameter, aber es wird explizit in der Dokumentation von Apple erwähnt, dass er NULL sein kann ... (< em> Update : Ich habe versucht, ein gültiges Nicht-NULL-Array zu übergeben, um herauszufinden, ob die Dokumentation falsch ist, aber ich habe immer noch den gleichen Fehler).

Könnten Sie mir bitte irgendwelche Hinweise (Wortspiel beabsichtigt) über diesen Unfall geben? Was fehlt mir hier? Alle Tutorials und Referenzen, die ich bisher gefunden habe, schlagen vor, CGDataProvider und CGImage einfach so zu verwenden.

    
Nikolai Ruhe 11.09.2012, 06:19
quelle

1 Antwort

5

Wenn Sie einen Dateinamen verwenden, verwendet der Beispielcode aus der Apple-Dokumentation eine Kombination aus dem, was Sie in Ihren Kommentaren angegeben haben, plus dem Wert kCGRenderingIntentPerceptual und nicht dem Standardwert:

%Vor%

Dies sollte verhindern, dass Sie die Daten selbst in Ihrem Programm behalten müssen, und kann den angezeigten Fehler verhindern.

(Vielleicht sollten Sie zumindest den Beispielcode für CoreTextPageViewer in der offiziellen iOS-Dokumentation ausprobieren und ausprobieren, dieses Projekt erstellen und versuchen, herauszufinden, wie sich das unterscheidet, was Sie tun.)

    
john.k.doe 11.09.2012, 06:36
quelle