Leider scheint es für JPEG nicht einfach zu sein. Sie sollten sich die Quelle für das Befehlszeilen-Tool jhead
ansehen. Es stellt diese Informationen bereit. Wenn Sie die Quelle durchlaufen, sehen Sie die Funktion ReadJpegSections
. Diese Funktion durchsucht alle in der JPEG-Datei enthaltenen Segmente, um die gewünschten Informationen zu extrahieren. Die Bildbreite und -höhe wird erhalten, wenn die Rahmen verarbeitet werden, die einen SOFn
Marker haben.
Ich sehe die Quelle in der Public Domain, also werde ich das Snippet zeigen, dass die Bildinfo bekommt:
static int Get16m(const void * Short)
{
return (((uchar *)Short)[0] << 8) | ((uchar *)Short)[1];
}
static void process_SOFn (const uchar * Data, int marker)
{
int data_precision, num_components;
data_precision = Data[2];
ImageInfo.Height = Get16m(Data+3);
ImageInfo.Width = Get16m(Data+5);
aus dem Quellcode, ist es mir klar, gibt es keinen einzigen „header "Mit dieser Information. Sie müssen die JPEG-Datei durchsuchen und jedes Segment analysieren, bis Sie das Segment mit den gewünschten Informationen gefunden haben. Dies wird in der wikipedia article beschrieben:
Ein JPEG-Bild besteht aus einer Folge von Segmenten, jeder beginnend mit einem Marker, von denen jeder mit einem 0xFF Byte gefolgt von einem Byte beginnt angibt, welche Art von Marker ist. Einige Markierungen bestehen nur aus diesen zwei Bytes; Anderen folgen zwei Bytes, die die Länge markerspezifischer Nutzdaten angeben, die folgen.
ein JPEG-Datei besteht aus einer Folge von Segmenten:
SEGMENT_0
SEGMENT_1
SEGMENT_2
...
Jedes Segment beginnt mit einem 2-Byte-Marker. Das erste Byte ist 0xFF
, das zweite Byte bestimmt den Typ des Segments. Danach folgt eine Codierung der Länge des Segments. Innerhalb des Segments gibt es Daten, die für diesen Segmenttyp spezifisch sind.
Die Bildbreite und -höhe wird in einem Segment des Typs SOFn
oder "Start of frame [n]" gefunden, wobei "n" eine Zahl ist, die für einen JPEG-Decoder etwas Besonderes bedeutet. Es sollte gut genug sein, nur nach einem SOF0
zu suchen, und seine Byte-Bezeichnung ist 0xC0
. Sobald Sie diesen Rahmen gefunden haben, können Sie ihn entschlüsseln, um die Höhe und Breite des Bildes zu finden.
So ist die Struktur eines Programms zu tun, was würden Sie aussehen wollen wie:
file_data = the data in the file
data = &file_data[0]
while (data not at end of file_data)
segment_type = decoded JPEG segment type at data
if (type != SOF0)
data += byte length for segment_type
continue
else
get image height and width from segment
return
Dies ist im Wesentlichen die in Michael Petrov's get_jpeg_size()
implementation gefunden Struktur.
Haben Sie die Details, was in den JPEG-Dateien enthalten ist? Wenn Sie haben, fügen Sie es bitte in Ihre Frage ein. Ich bezweifle, dass Ihre obige Methode funktioniert, da es in der Regel eine Kopfzeile am Anfang gibt und dann die eigentlichen Pixelwerte beginnen. Wenn Sie nur die Höhe und Breite Informationen benötigen, glaube ich, dass Sie das bekommen können, indem Sie den Header allein lesen. – shrm
@misfr: Ich spreche über 'JPEG-Dateien' im Allgemeinen. –
Ich verstehe das, aber die Frage ist, wissen Sie, was ist das Format für JPEG-Dateien? Oder willst du, dass wir es für dich finden? – shrm