2017-10-07 114 views
0

我想使用指向PNG文件中位置的指針來獲取PNG圖像的高度和重量。獲取PNG圖像的高度和重量

我使用read_image()來讀取內存,但是我用這種方法得到的寬度是115200,高度是115464,但是我的圖片寬度是450;身高:451

這裏是我的代碼:

#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; 
    } 

有與我read_image()功能沒有問題,我想到的ntohl()

+0

爲什麼偏移量爲17和21? – alk

+0

因爲png文件的這個例子: –

+1

通過在基地址上加16來得到第17個字節。 – alk

回答

2

的PNG的寬度應在偏移16,在高度偏移20

所以改變這種

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

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

Details on the PNG format are here.

+1

+1我們有8個字節用於簽名,另外8個用於IDAT塊頭(塊ID爲4個字節,塊長度爲4個字節)。 – leonbloy