2011-03-18 38 views

回答

7

寬度是從文件中偏移量16開始的4字節整數。高度是從偏移量20開始的另一個4字節整數。它們都是網絡順序,所以您需要轉換爲主機順序來正確解釋它們。

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

圖像的尺寸位於頭部,所以你需要加載該文件,並解析了頭。

因此,由於您不想使用第三方庫,您可以隨時檢查PNG規範並實現自己的解析器。

+0

謝謝你,生病嘗試 – 2011-03-18 15:53:43

6

不,你不能不讀取文件的一部分。幸運的是,如果您不需要讀取實際的圖像數據,則文件標頭非常簡單,您可以在沒有庫的情況下閱讀它們。

如果你確定你有一個有效的PNG文件,你可以從偏移量16和20(每個4字節,大端)讀取寬度和高度,但也可能是一個好主意,該文件的前8個字節正好是「89 50 4E 47 0D 0A 1A 0A」(十六進制),而字節12-15正好是「49 48 44 52」(ASCII爲「IHDR」)。

+0

它工作!真的很感謝你 – 2011-03-18 15:59:15

相關問題