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

OSCHINA-MIRROR/xiaozhuai-imageinfo

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.md 5.5 КБ
Копировать Редактировать 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 и выполните следующие команды:

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 )

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

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