簡體   English   中英

C++ 如何獲取 png 文件的圖像大小(在目錄中)

[英]C++ How to get the Image size of a png file (in directory)

有沒有辦法在特定路徑中獲取 png 文件的尺寸? 我不需要加載文件,我只需要寬度和高度來在 directx 中加載紋理。

(而且我不想使用任何第三方庫)

寬度是一個4字節的整數,從文件中的偏移量16開始。 高度是從偏移量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;
}

不,如果不閱讀部分文件,你就無法做到。 幸運的是,如果您不需要讀取實際的圖像數據,文件頭很簡單,您可以在沒有庫的情況下讀取它們。

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

圖像的大小位於標題中,因此您需要加載文件並解析標題。

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

基於@Jerry 的回答,但不包括 winsock.h

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

您可以隨時手動解碼文件,只需查找您感興趣的位。 這是一篇關於PNG文件格式的文章的鏈接。 您正在尋找包含寬度和高度的IHDR塊。 它應該是文件中的第一位數據,因此應該很容易獲得。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM