[英]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.