2017-10-07 15 views
0

J'essaie d'obtenir la taille et le poids d'une image PNG en utilisant des pointeurs vers les deux emplacements dans le fichier PNG.Obtenez la taille et le poids d'une image png

Je lis la mémoire en utilisant read_image(), mais ce que je reçois de cette façon est largeur: 115200 et hauteur: 115464, mais ma photo a une largeur: 450; hauteur: 451.

Voici mon code:

#include<stdio.h> 
    #include<stdint.h> 
    #include<arpa/inet.h> 
    #include <unistd.h> 
    #include <sys/types.h> 
    #include <sys/stat.h> 
    #include <fcntl.h> 
    #include <stdlib.h> 

    void *read_image(const char *filepath); 
    int main(int argc, char** argv) 
    { 
     char *ptr=read_image(argv[1]); 
     uint32_t *point1=ptr+17; 
     uint32_t *point2=ptr+21; 
     uint32_t point1_res=ntohl(*point1); 
     uint32_t point2_res=ntohl(*point2); 
     printf("\nWidth: %d",point1_res); 
     printf("\nHeight: %d",point2_res); 
     return 0; 
    } 
    void *read_image(char *path) { 
     int fd = open(path, O_RDONLY); 
     if (fd < 0) { 
     return NULL; 
     } 
     size_t size = 1000; 
     size_t offset = 0; 
     size_t res; 
     char *buff = malloc(size); 

     while((res = read(fd, buff + offset, 100)) != 0) { 
      offset += res; 
      if (offset + 100 > size) { 
        size *= 2; 
        buff = realloc(buff, size); 
      } 
     } 
     close(fd); 
     return buff; 
    } 

Il n'y a pas de problème avec ma fonction read_image(), je pense à ntohl()?

+0

Pourquoi les compensations '17' et' 21'? – alk

+0

à cause de cet exemple d'un fichier png: –

+1

Le 17ème octet que vous obtenez en ajoutant 16 à l'adresse de base. – alk

Répondre

2

La largeur de la PNG sont à l'offset 16, la hauteur à l'offset 20.

donc changer cette

uint32_t *point1=ptr+17; 
    uint32_t *point2=ptr+21; 

être

uint32_t *point1=ptr+16; 
    uint32_t *point2=ptr+20; 

(Details on the PNG format are here.)

+1

+1 Nous avons 8 octets pour la signature, plus 8 pour l'en-tête de bloc IDAT (4 octets pour l'ID de bloc, + 4 octets pour la longueur de bloc). – leonbloy