Wie man die Breite/Höhe der jpeg-Datei ohne Bibliothek?
Erstens möchte ich sagen, dass ich viele Male versucht, die Antwort zu finden, indem mit Hilfe der google-Suche, und ich fand viele Ergebnisse, aber ich Verstand nicht, denn ich weiß nicht, die Idee beim Lesen einer Binär-Datei, und wandeln Sie den Wert, Erhalten zu lesbaren Wert.
, Was ich versucht habe, es zu tun.
unsigned char fbuff[16];
FILE *file;
file = fopen("C:\\loser.jpg", "rb");
if(file != NULL){
fseek(file, 0, SEEK_SET);
fread(fbuff, 1, 16, file);
printf("%d\n", fbuff[1]);
fclose(file);
}else{
printf("File does not exists.");
}
Ich will eine einfache Erklärung mit Beispiel zeigt, wie man die Breite/Höhe der jpeg-Datei aus der Kopfzeile, und klicken Sie dann konvertieren Sie den Wert in lesbaren Wert.
- Sie haben die details von dem, was enthalten ist in den jpeg-Dateien? Wenn Sie haben, geben Sie diese bitte bei Ihrer Frage. Ich bezweifle, dass deine oben genannte Methode funktionieren wird, da es im Allgemeinen einen header am Anfang und dann die eigentliche pixel-Werte. Wenn Sie nur die Höhe und Breite Informationen, ich glaube, Sie können, dass durch das Lesen der header allein.
- Ich spreche
jpeg files
im Allgemeinen. - Ich verstehe, dass, aber die Frage ist, wissen Sie, was ist das format für jpeg-Dateien? Oder wollen Sie uns, um finden es für Sie ?
- Dies ist die erste Zeit Umgang mit binären Dateien, wie z.B. jpeg, und ich verstehe nicht, nichts über, die.
- Werfen Sie einen Blick auf dieses fastgraph.com/help/jpeg_header_format.html. Es sagt, dass der header enthält die Breite und Höhe Informationen an den offsets 2 und 4 beziehungsweise. Alles, was Sie tun müssen, ist, dass Punkt der
fread
um diese offsets mitfseek
und Lesen, 2 bytes, die von jeder Position. Dann müssen Sie zur Konvertierung von bytes in Ganzzahlen. Probieren Sie es aus. - Ich habe es getan, bevor, aber es gibt mir geheimnisvolle Zahl, wie konvertiert man diese Zahl um den wahren Wert.
- lassen Sie uns weiter, diese Diskussion im chat
- der link, den Sie gab (fastgraph.com/help/jpeg_header_format.html) enthält, die völlig falsche Informationen über JPEG-header. Sogar der Stempel ist falsch. Dann Breite und Höhe an offset 2 und 4 bzw/ly? Diese Leute müssen verrückt sein.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Leider, es scheint nicht einfach zu sein für JPEG. Sie sollten einen Blick auf die Quelle der
jhead
Kommandozeilen-tool. Es enthält diese Informationen. Wenn man durch die Quelle, sehen Sie die FunktionReadJpegSections
. Diese Funktion scannt durch alle Segmente innerhalb der JPEG-Datei zu extrahieren Sie die gewünschten Informationen. Die Bildbreite und-Höhe erhalten wird, wenn die Verarbeitung der frames, die eineSOFn
marker.Ich sehe die Quelle ist in der public domain, so zeige ich das snippet, das bekommt die Bild-info:
Vom source-code, es ist mir klar, es ist kein einziges "header" mit diesen Informationen. Haben Sie das Scannen durch die JPEG-Datei, Parsen jedes segment, bis Sie finden, das segment mit den Informationen, die Sie möchten. Dies ist beschrieben in der wikipedia-Artikel:
JPEG-Datei besteht aus einer Sequenz von Segmenten:
Jedes segment beginnt mit einer 2-byte-marker. Das erste byte ist
0xFF
, das zweite byte legt die Art des Segments. Dies ist gefolgt von einer Kodierung der Länge des Segments. Innerhalb des segment-spezifische Daten zu diesem segment geben.Die Bildbreite und-Höhe in einem segment vom Typ
SOFn
oder "Start of frame [n]", wobei "n" eine Zahl ist) bedeutet, dass etwas besonderes in ein JPEG-decoder. Es sollte gut genug, um sich nur für einenSOF0
und byte Bezeichnung ist0xC0
. Sobald Sie diesen Rahmen, der Sie entschlüsseln kann, um das Bild in Höhe und Breite.Also die Struktur eines Programms zu tun, was Sie wollen, würde wie folgt Aussehen:
Dies ist im wesentlichen der Struktur gefunden Michael Petrov ' s
get_jpeg_size()
Umsetzung.dann haben Sie zu finden, der Höhe und der Breite marker des jpeg, das ist [ffc0].
finden, nachdem ffc0 im Binär-Format, die die vier,fünf bytes sind in der Höhe und sechs und sieben bytes sind Breite.
die Frage ist alt und die anderen Antworten sind korrekt, aber Ihr format ist nicht der einfachste. Ich habe gerade mit
getc
um schnell die Abmessungen, während das überspringen irrelevant Marker (es unterstützt auch Progressive JPEGs):Hier sind ein paar einfache code, den ich schrieb, das scheint zuverlässig zu funktionieren.
C/C++
?, was istSeek
,Read
Funktionen ?, und Was ist der nutzen dieser FunktionMOTOSHORT
?, auch wasiHandle
variable ?.Hier ist ein code, den ich geschrieben in Java. Funktioniert gut für JPEG-Bilder aus einer Kamera. Es scannt den gesamten code zu finden, der größten Bildgröße. Ich konnte es nicht verbessern, es zu überspringen, auf die Länge von jedem block, weil es nicht funktioniert. Wenn sich jemand verbessern kann, der code dazu wäre es toll.
Abmessungen der Bilder im JPEG-Dateien finden Sie wie folgt:
1) Schauen Sie, für FF C0
2) An den offsets +4 und +6 nach dieser Position sind in Höhe und Breite (Wörter), bzw/ly.
In den meisten Fällen, ist das absolute offset von Höhe und Breite A3 und A5, bzw/ly.