Heim >Backend-Entwicklung >C++ >Wie kann ich Bildabmessungen ermitteln, ohne die gesamte Datei zu laden?
Erhalten Sie Bildabmessungen ohne vollständige Dateiverarbeitung
Bei der Bildbearbeitung ist es oft notwendig, die Größe eines Bildes vor der weiteren Bearbeitung zu bestimmen. Um die Bildabmessungen zu ermitteln, muss jedoch normalerweise das gesamte Bild in den Speicher geladen werden.
Für Szenarien, in denen Speicherressourcen von entscheidender Bedeutung sind, ist ein effizienterer Ansatz erforderlich. In diesem Artikel wird eine Möglichkeit untersucht, Bildabmessungen zu ermitteln, ohne die gesamte Datei zu lesen, indem einfach die Standardklassenbibliothek verwendet wird.
Bildkopfinformationen dekodieren
Bildformate kodieren wichtige Informationen in ihren Header-Informationen. Durch das Parsen dieser Header können wir die Dimensionen extrahieren, ohne die gesamte Datei zu verbrauchen. Verschiedene Bildformate verwenden unterschiedliche Header-Informationen mit jeweils eigener Struktur. Beispielsweise enthält der JPEG-Header eine Folge von Tags, während der PNG-Header Little-Endian-Ganzzahlen verwendet.
Implementierungsmethode
Wir erstellen zunächst ein Wörterbuch (imageFormatDecoders), das die „magischen Bits“ des Headers Funktionen zuordnet, die die entsprechenden Header analysieren. Diese Funktionen extrahieren Breiten- und Höheninformationen aus dem Stream.
<code class="language-csharp">private static Dictionary<byte[], Func<BinaryReader, Size>> imageFormatDecoders = new Dictionary<byte[], Func<BinaryReader, Size>>() { { new byte[]{ 0x42, 0x4D }, DecodeBitmap}, { new byte[]{ 0x47, 0x49, 0x46, 0x38, 0x37, 0x61 }, DecodeGif }, { new byte[]{ 0x47, 0x49, 0x46, 0x38, 0x39, 0x61 }, DecodeGif }, { new byte[]{ 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A }, DecodePng }, { new byte[]{ 0xff, 0xd8 }, DecodeJfif }, };</code>
Um die Abmessungen des Bildes zu erhalten, erstellen wir ein BinaryReader-Objekt und rufen die GetDimensions-Methode auf. Diese Methode durchläuft die Header-Magic-Bits, vergleicht sie mit den Schlüsseln im imageFormatDecoders-Wörterbuch und delegiert die Größenextraktion an die entsprechende Funktion, wenn eine Übereinstimmung gefunden wird.
<code class="language-csharp">public static Size GetDimensions(string path) { using (BinaryReader binaryReader = new BinaryReader(File.OpenRead(path))) { try { return GetDimensions(binaryReader); } catch (ArgumentException e) { if (e.Message.StartsWith(errorMessage)) { throw new ArgumentException(errorMessage, "path", e); } else { throw e; } } } }</code>
Beispielverwendung
Nachdem Sie die Bibliothek in Ihr Projekt integriert haben, ist das Abrufen der Bildabmessungen ganz einfach:
<code class="language-csharp">string imagePath = "/path_to_image/image.png"; Size dimensions = ImageHelper.GetDimensions(imagePath);</code>
Zusammenfassung
Diese Lösung nutzt verfügbare Bildformat-Decoder und funktioniert mit einer Vielzahl von Bilddateitypen. Es bietet eine plattformunabhängige Methode zum Abrufen der Bildgröße, die besonders in Umgebungen mit begrenzten Ressourcen wertvoll ist.
Das obige ist der detaillierte Inhalt vonWie kann ich Bildabmessungen ermitteln, ohne die gesamte Datei zu laden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!