Кроссплатформенная сверхбыстрая библиотека C++ с одним заголовком для получения размера и формата изображения без загрузки/декодирования.
В imageinfo формат изображения определяется не по расширению файла, а по байтам и символам в заголовке файла.
Как можно меньше операций ввода-вывода! Считывайте как можно меньше байт!
Некоторые тестовые файлы изображений взяты из image-size. Большое спасибо @netroy.
Версия Rust: imageinfo-rs
Библиотека imageinfo была реструктурирована, если вы используете старую версию, пожалуйста, проверьте ветку v1
.
imageinfo доступна на vcpkg
vcpgk install imageinfo
cmake -B build .
cmake --build build -- all
cmake --build build -- check
Откройте командную строку Visual Studio и выполните следующие команды:
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
, а также есть встроенные считыватели 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;
};
Затем давайте попробуем создать считыватель для файлов ресурсов Android.
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);
Pretty easy? Don't be stingy with your star : )
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )