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

OSCHINA-MIRROR/xiaozhuai-imageinfo

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Кроссплатформенная сверхбыстрая библиотека 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 )

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

Введение

Кроссплатформенная высокопроизводительная библиотека C++ в виде одного заголовочного файла, которая позволяет получить тип и размер файла изображения без загрузки/декодирования. Поддерживаемые форматы: avif, bmp, cur, dds, gif, hdr (pic), heic (heif), icns, ico, jp2, jpeg (jpg), jpx, ktx, png, psd, qoi, tga, tiff (tif), webp. Развернуть Свернуть
MIT
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
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