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
Susan SarandonOriginal
2025-01-10 12:09:51994Durchsuche

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>

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!

Stellungnahme:
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