Maison >développement back-end >C++ >Comment puis-je obtenir les dimensions de l'image sans charger l'intégralité du fichier ?

Comment puis-je obtenir les dimensions de l'image sans charger l'intégralité du fichier ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-10 12:09:51996parcourir

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

Obtenez les dimensions de l'image sans traitement complet du fichier

En traitement d'image, il est souvent nécessaire de déterminer la taille d'une image avant un traitement ultérieur. Cependant, pour obtenir les dimensions de l'image, il faut généralement charger l'intégralité de l'image en mémoire.

Pour les scénarios où les ressources mémoire sont critiques, une approche plus efficace est nécessaire. Cet article explore un moyen d'obtenir les dimensions d'une image sans lire l'intégralité du fichier, en utilisant simplement la bibliothèque de classes standard.

Décoder les informations d'en-tête de l'image

Les formats d'image codent des informations importantes dans leurs informations d'en-tête. En analysant ces en-têtes, nous pouvons extraire les dimensions sans consommer l'intégralité du fichier. Différents formats d'image utilisent différentes informations d'en-tête, chacune avec sa propre structure. Par exemple, l'en-tête JPEG contient une séquence de balises, tandis que l'en-tête PNG utilise des entiers little-endian.

Méthode de mise en œuvre

Nous créons d'abord un dictionnaire (imageFormatDecoders) qui mappe l'en-tête "bits magiques" aux fonctions qui analysent les en-têtes correspondants. Ces fonctions extraient les informations de largeur et de hauteur du flux.

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

Pour obtenir les dimensions de l'image, nous créons un objet BinaryReader et appelons la méthode GetDimensions. Cette méthode parcourt les bits magiques d'en-tête, les compare aux clés du dictionnaire imageFormatDecoders et, si une correspondance est trouvée, délègue l'extraction de la taille à la fonction appropriée.

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

Exemple d'utilisation

Après avoir intégré la bibliothèque dans votre projet, récupérer les dimensions de l'image est simple :

<code class="language-csharp">string imagePath = "/path_to_image/image.png";
Size dimensions = ImageHelper.GetDimensions(imagePath);</code>

Résumé

Cette solution utilise les décodeurs de formats d'image disponibles et fonctionne avec une variété de types de fichiers image. Il fournit une méthode indépendante de la plate-forme pour récupérer la taille des images, particulièrement utile dans les environnements aux ressources limitées.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn