9
votes

C ++ Comment obtenir la taille d'image d'un fichier PNG (dans le répertoire)

Y a-t-il un moyen d'obtenir les dimensions d'un fichier PNG dans un chemin spécifique? Je n'ai pas besoin de charger le fichier, j'ai juste besoin de la largeur et de la hauteur pour charger une texture dans DirectX.

(et je ne veux pas utiliser de tiers-libs-libs)


0 commentaires

5 Réponses :


3
votes

La taille de l'image est située dans l'en-tête, vous devez donc charger le fichier et analyser l'en-tête.

Donc, puisque vous ne voulez pas utiliser une bibliothèque tierce partie, vous pouvez toujours vérifier les spécifications PNG et mettre en œuvre votre propre analyseur.


0 commentaires

1
votes

Vous pouvez toujours décoder le fichier manuellement et rechercher les bits qui vous intéressent. Voici un lien vers un article sur les formats de fichier PNG. . Vous recherchez le morceau IHDR et qui contient la largeur et la hauteur. Il devrait être le premier bit de données dans le fichier afin qu'il soit assez facile d'obtenir à.


0 commentaires

7
votes

Non, vous ne pouvez pas le faire sans lire une partie du fichier. Heureusement, les en-têtes de fichiers sont assez simples pour que vous puissiez les lire sans une bibliothèque, si vous n'avez pas besoin de lire les données d'image réelles.

Si vous savez certainement que vous avez un fichier PNG valide, vous pouvez lire la largeur et la hauteur des compensations 16 et 20 (4 octets chacun, Big-Endian), mais il peut également être une bonne idée de vérifier que le Les 8 premiers octets du fichier sont exactement "89 50 47 0A 0A 1A 0A" (Hex) et que les octets 12-15 sont exactement "49 48 44 52" ("IHDR" en ASCII).


0 commentaires

15
votes

La largeur est un entier de 4 octets à partir du décalage 16 dans le fichier. La hauteur est un autre entier de 4 octets à partir de décalage 20. Ils sont tous deux dans la commande réseau, vous devez donc convertir en ordre d'hôte pour les interpréter correctement.

#include <fstream>
#include <iostream>
#include <winsock.h>

int main(int argc, char **argv) { 
    std::ifstream in(argv[1]);
    unsigned int width, height;

    in.seekg(16);
    in.read((char *)&width, 4);
    in.read((char *)&height, 4);

    width = ntohl(width);
    height = ntohl(height);

    std::cout << argv[1] << " is " << width << " pixels wide and " << height << " pixels high.\n";
    return 0;
}


0 commentaires

1
votes

basé sur @jerry réponse, mais sans winsock.h inclus

        void get_png_image_dimensions(std::string& file_path, unsigned int& width, unsigned int& height)
        {
            unsigned char buf[8];
            
            std::ifstream in(file_path);
            in.seekg(16);
            in.read(reinterpret_cast<char*>(&buf), 8);

            width = (buf[0] << 24) + (buf[1] << 16) + (buf[2] << 8) + (buf[3] << 0);
            height = (buf[4] << 24) + (buf[5] << 16) + (buf[6] << 8) + (buf[7] << 0);
        }


0 commentaires