2017-10-07 4 views
0

Ich versuche, die Höhe und das Gewicht eines PNG-Bildes mit Zeigern zu den Standorten an beiden in der PNG-Datei zu erhalten.Holen Sie sich die Höhe und das Gewicht eines PNG-Bilds

Ich lese den Speicher mit read_image(), aber was ich auf diese Weise bekomme, ist Breite: 115200 und Höhe: 115464, aber mein Bild hat Breite: 450; Höhe: 451.

Hier mein 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; 
    } 

Es gibt kein Problem mit meiner read_image() Funktion, ich ntohl() denke?

+0

zu sein Warum die Offsets '17' und' 21'? – alk

+0

wegen dieses Beispiels einer PNG-Datei: –

+1

Das 17. Byte erhalten Sie, indem Sie 16 zur Basisadresse hinzufügen. – alk

Antwort

2

Die Breite des PNG wird auf 16 versetzt werden, um die Höhenversatz 20

Also das

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

ändern

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

(Details on the PNG format are here.)

+1

+1 Wir haben 8 Bytes für die Signatur, plus 8 für den IDAT Chunk-Header (4 Bytes für Chunk-ID, + 4 Bytes für Chunk-Länge). – leonbloy

Verwandte Themen