代码拉取完成,页面将自动刷新
同步操作将从 xiaozhuai/imageinfo 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
跨平台高性能的C++单个头文件库,在不加载/解码图片的情况下,获取图片文件类型和大小。
imageinfo 并不是通过扩展名来识别图片格式,而是通过文件头和文件格式特征来判断图片格式。
尽可能少的I/O次数!读取尽可能少的字节数!
部分测试图片文件来源于 image-size ,感谢 @netroy
Rust 版本: imageinfo-rs
cmake -B build .
cmake --build build -- all
cmake --build build -- check
call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvars32.bat"
cmake -G "NMake Makefiles" -B build .
cmake --build build -- all
cmake --build build -- check
auto imageInfo = getImageInfo<IIFilePathReader>("images/valid/jpg/sample.jpg");
std::cout << "File: " << file << "\n";
std::cout << " - Error : " << imageInfo.getErrorMsg() << "\n";
std::cout << " - Width : " << imageInfo.getWidth() << "\n";
std::cout << " - Height : " << imageInfo.getHeight() << "\n";
std::cout << " - Format : " << imageInfo.getFormat() << "\n";
std::cout << " - Ext : " << imageInfo.getExt() << "\n";
std::cout << " - Full Ext : " << imageInfo.getFullExt() << "\n";
std::cout << " - Mimetype : " << imageInfo.getMimetype() << "\n\n";
可以使用 IIFilePathReader
然后直接传入文件路径,
不同类型可以使用不同的 Reader, 如 IIFileReader
, IIFileStreamReader
, IIRawDataReader
FILE *file = fopen("images/valid/jpg/sample.jpg", "rb");
auto imageInfo = getImageInfo<IIFileReader>(file);
fclose(file);
std::ifstream file("images/valid/jpg/sample.jpg", std::ios::in);
auto imageInfo = getImageInfo<IIFileStreamReader>(file);
file.close();
// 假设已经得到了 data 和 size
// void *data;
// size_t size;
auto imageInfo = getImageInfo<IIRawDataReader>(IIRawData(data, size));
如果你事先知道一个文件大概率是JPEG格式, 你可以提供额外的 likely format
参数来提升性能;
auto imageInfo = getImageInfo<IIFilePathReader>("images/valid/jpg/sample.jpg", II_FORMAT_JPEG);
首先,来看一下 IIFileReader
, 要做的只是定义一个类,然后实现 size
和 read
方法。(非override)
class IIFileReader {
public:
explicit IIFileReader(FILE *file) : m_file(file) {}
inline size_t size() {
if (m_file != nullptr) {
fseek(m_file, 0, SEEK_END);
return ftell(m_file);
} else {
return 0;
}
}
inline void read(void *buf, off_t offset, size_t size) {
fseek(m_file, offset, SEEK_SET);
fread(buf, 1, size, m_file);
}
private:
FILE *m_file = nullptr;
};
然后,让我们来尝试实现一个Android assets文件的Reader
class IIAndroidAssetFileReader {
public:
explicit IIAndroidAssetFileReader(AAsset *file) : m_file(file) {}
inline size_t size() {
if (m_file != nullptr) {
return AAsset_getLength(m_file);
} else {
return 0;
}
}
inline void read(void *buf, off_t offset, size_t size) {
AAsset_seek(m_file, offset, SEEK_SET);
AAsset_read(m_file, buf, size);
}
private:
AAsset *m_file = nullptr;
};
// 假设已经得到了 AAssetManager
// AAssetManager *manager;
// 以 AASSET_MODE_RANDOM 模式打开以支持双向seek
AAsset *file = AAssetManager_open(manager, "test.png", AASSET_MODE_RANDOM);
auto imageInfo = getImageInfo<IIAndroidAssetFileReader>(file);
AAsset_close(file);
很简单不是吗?
请不要吝啬你的Star : )
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。