1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/xiaozhuai-imageinfo

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README_CN.md 6 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 30.11.2024 16:17 950f49d

Кроссплатформенная высокопроизводительная библиотека C++ с одним заголовочным файлом, которая позволяет получить тип и размер файла изображения без загрузки/декодирования.

ImageInfo не определяет формат изображения по расширению, а использует информацию из заголовка файла и особенности формата.

Библиотека старается минимизировать количество операций ввода-вывода и считывать как можно меньше данных.

Некоторые тестовые файлы изображений взяты из проекта image-size, спасибо @netroy.

Версия для Rust: imageinfo-rs.

ci

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 Да

Vcpkg

Imageinfo можно установить через vcpkg.

vcpgk install imageinfo

Сборка и тестирование

Linux и MacOS

cmake -B build .
cmake --build build -- all
cmake --build build -- check

Windows

Откройте 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});

Пользовательский Reader

Сначала рассмотрим 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 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/xiaozhuai-imageinfo.git
git@api.gitlife.ru:oschina-mirror/xiaozhuai-imageinfo.git
oschina-mirror
xiaozhuai-imageinfo
xiaozhuai-imageinfo
master