Hilfe beim Lesen von JPEG-Dateien mit libjpeg

7

Ich folgte dem Beispielcode in der Beispieldatei libjpeg, konnte jedoch die Bilddaten nicht lesen.

Ich habe die folgende Struktur und ich habe eine Instanz dieser Struktur erstellt.

%Vor%

Unten ist meine Funktion read_JPEG_file:

%Vor%

Bei dieser JPEG_READ_SCANLINES-Funktion tritt in Schritt 6 oben immer ein Fehler auf. Ich habe ein "EXC_BAD_ACCESS" -Signal in dieser Zeile.

Hat jemand eine Idee oder einige Arbeitsbeispiele zum Lesen von .jpg-Dateien mit libjpeg, die Sie hier teilen können? Ich habe die Größe meiner imageData- & gt; Pixel überprüft und sie mit der Größe der JPEG-Datei selbst verglichen, und sie hat dieselbe Größe. Der Speicher für diese Variable wurde ebenfalls dynamisch zugewiesen, sodass ich weiß, dass es sich nicht um ein Speicherproblem handelt.

Irgendwelche Ideen?

    
all_by_grace 11.04.2011, 02:26
quelle

4 Antworten

5

jpeg_read_scanlines Funktion empfängt ein Array von Zeigern (nicht den direkten Zeiger von Pixeln als imageData- & gt; Pixel). Also sollten wir zuerst einen JSAMPARRAY erstellen:

%Vor%

In Ihrem Code haben Sie einen "Puffer" mit "cinfo.mem- & gt; alloc_sarray" erstellt, aber Sie verwenden ihn nie. Der letzte Schritt besteht darin, den "Puffer" als Argument von jpeg_read_scanlines zu übergeben:

%Vor%

Sehen Sie, dass wir "imageData- & gt; Pixel + Counter" verwenden, nicht nur "imageData- & gt; Pixel" wie in Ihrem Code. Auf diese Weise schreiben wir jede Zeile nach der anderen in den gesamten Speicherbereich "imageData- & gt; Pixel".

    
dacap 11.04.2011, 03:24
quelle
14

Hier ist ein Beispiel zum Lesen eines JPEG-Bildes:

%Vor%     
Jim 17.03.2014 19:22
quelle
3

Wie Dacap sagte, erwartet es einen JSAMPARRAY. Davon abgesehen können Sie direkt in Ihr imageData - & gt; Pixel-Array schreiben, wenn Sie möchten. Sie müssen nur so etwas tun:

%Vor%

Sie können dann die Allokierung des Puffers ganz überspringen. Die Verwendung von memcpy funktioniert gut, aber warum muss die zusätzliche Kopie, wenn Sie nicht müssen?

    
KSletmoe 07.09.2012 21:19
quelle
3

Hier ist eine aufgeräumte Version des Codes von Jim. Es verwendet auch ein CImg als Ausgabeformat, was es ein wenig expliziter macht, wie die RGB-Werte extrahiert werden.

%Vor%

Auch eine Randnotiz für diejenigen, die möglicherweise in demselben Problem stecken geblieben sind, wenn Sie libjpeg aus C ++ verwenden, ist es wichtig, eine Version von jpeglib.h zu haben, die

enthält %Vor%

Ich habe eine Version der Datei verwendet, die das nicht hatte und Linkfehler erhalten hat.

    
M Katz 07.12.2014 08:17
quelle

Tags und Links