Heim > Backend-Entwicklung > C++ > Wie kann ich Bildabmessungen ermitteln, ohne die gesamte Datei zu laden?

Wie kann ich Bildabmessungen ermitteln, ohne die gesamte Datei zu laden?

Susan Sarandon
Freigeben: 2025-01-10 12:09:51
Original
992 Leute haben es durchsucht

How Can I Get Image Dimensions Without Loading the Entire File?

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage