Кроссплатформенная высокопроизводительная библиотека C++ с одним заголовочным файлом, которая позволяет получить тип и размер файла изображения без загрузки/декодирования.
ImageInfo не определяет формат изображения по расширению, а использует информацию из заголовка файла и особенности формата.
Библиотека старается минимизировать количество операций ввода-вывода и считывать как можно меньше данных.
Некоторые тестовые файлы изображений взяты из проекта image-size, спасибо @netroy.
Версия для Rust: imageinfo-rs.
ImageInfo была переработана, если вы используете старую версию, пожалуйста, проверьте ветку v1.
Формат | Поддержка |
---|---|
avif | Да |
bmp | Да |
cur | Да |
dds | Да |
gif | Да |
hdr (pic) | Да |
heic (heif) | Да |
icns | Да |
ico | Да |
jpeg2000 code stream (j2k, j2c, jpc, jhc) | Да |
jpeg2000 (jp2, jpx, jph) | Да |
jpeg (jpg) | Да |
ktx | Да |
png | Да |
psd | Да |
qoi | Да |
tga | Да |
tiff (tif) | Да |
webp | Да |
Imageinfo можно установить через vcpkg.
vcpgk install imageinfo
cmake -B build .
cmake --build build -- all
cmake --build build -- check
Откройте Visual Studio Command Prompt и выполните следующие команды:
cmake -G "NMake Makefiles" -B build .
cmake --build build -- all
cmake --build build -- check
const char *file = "images/valid/jpg/sample.jpg";
auto info = imageinfo::parse<imageinfo::FilePathReader>(file);
std::cout << "File: " << file << "\n";
std::cout << " - Error : " << info.error_msg() << "\n";
std::cout << " - Width : " << info.size().width << "\n";
std::cout << " - Height : " << info.size().height << "\n";
std::cout << " - Format : " << info.format() << "\n";
std::cout << " - Ext : " << info.ext() << "\n";
std::cout << " - Full Ext : " << info.full_ext() << "\n";
std::cout << " - Mimetype : " << info.mimetype() << "\n\n";
Можно использовать imageinfo::FilePathReader
и передать путь к файлу напрямую.
Для разных типов файлов можно использовать разные Reader, такие как imageinfo::FileReader
, imageinfo::FileStreamReader
, imageinfo::RawDataReader
.
FILE *file = fopen("images/valid/jpg/sample.jpg", "rb");
auto info = imageinfo::parse<imageinfo::FileReader>(file);
fclose(file);
std::ifstream file("images/valid/jpg/sample.jpg", std::ios::in | std::ios::binary);
auto info = imageinfo::parse<imageinfo::FileStreamReader>(file);
file.close();
// Предположим, что у вас уже есть данные и размер
// void *data;
// size_t size;
auto info = imageinfo::parse<imageinfo::RawDataReader>(imageinfo::RawData(data, size));
Если вы заранее знаете, что файл, скорее всего, имеет формат JPEG, вы можете предоставить дополнительный параметр likely_formats
, чтобы повысить производительность.
auto imageInfo = imageinfo::parse<imageinfo::FilePathReader>("images/valid/jpg/sample.jpg", {II_FORMAT_JPEG});
Сначала рассмотрим imageinfo::FileReader
. Нужно только определить класс и реализовать методы size
и read
.
class FileReader {
public:
explicit FileReader(FILE *file) : file_(file) {}
inline size_t size() {
if (file_ != nullptr) {
fseek(file_, 0, SEEK_END);
return ftell(file_);
} else {
return 0;
}
}
inline void read(void *buf, off_t offset, size_t size) {
fseek(file_, offset, SEEK_SET);
fread(buf, 1, size, file_);
}
private:
FILE *file_ = nullptr;
};
Затем давайте попробуем реализовать Reader для файлов Android assets.
class AndroidAssetFileReader {
public:
explicit AndroidAssetFileReader(AAsset *file) : file_(file) {}
inline size_t size() {
if (file_ != nullptr) {
return AAsset_getLength(file_);
} else {
return 0;
}
}
inline void read(void *buf, off_t offset, size_t size) {
AAsset_seek(file_, offset, SEEK_SET);
AAsset_read(file_, buf, size);
}
private:
AAsset *file_ = nullptr;
};
// Предположим, у вас есть AAssetManager
// AAssetManager *manager;
// Откройте файл в режиме AASSET_MODE_RANDOM для поддержки двустороннего поиска
AAsset *file = AAssetManager_open(manager, "test.png", AASSET_MODE_RANDOM);
auto imageInfo = imageinfo::parse<imageinfo::AndroidAssetFileReader>(file);
AAsset_close(file);
Это очень просто, не так ли?
Пожалуйста, поддержите проект, поставив ему звезду!
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )