Обробка та перетворення зображень за допомогою Open Source C++ API

Читайте, записуйте та конвертуйте популярні формати зображень, як-от PNG, JPEG, BMP, TIFF та багато інших за допомогою безкоштовної бібліотеки C++.

OpenImageIO — це потужна бібліотека обробки зображень, яка дає розробникам програмного забезпечення можливість читати, писати та обробляти популярні формати файлів зображень у програмах C++. Він забезпечує підтримку кількох популярних форматів зображень через плагіни. Він підтримує такі популярні формати зображень, як OpenEXR, TIFF, JPEG/JFIF, PNG, BMP, JPEG-2000, ICO, PNM, DPX, IFF, Field3D, Ptex, Photoshop PSD, GIF та багато інших.

Бібліотека OpenImageIO широко використовується в студіях анімації та VFX по всьому світу, а також інтегрована в численні комерційні продукти. Бібліотека OpenImageIO постачається з декількома інструментами командного рядка для зображень, які демонструють такі функції, як конвертація форматів зображень в інші, порівняння двох зображень, друк детальної інформації, пошук зображень за метаданими, простий перегляд зображень тощо.

Previous Next

Початок роботи з OpenImageIO

Система збірки OpenImageIO заснована на CMake. Якщо потрібно встановити його у вашій системі. Після створення OpenImageIO, якщо ви зібрали з прапорцем EMBEDPLUGINS=0, вам потрібно буде встановити змінну середовища OIIO_LIBRARY_PATH, щоб вказувати на каталог «lib», де встановлено OpenImageIO, інакше він не зможе знайти плагіни.

Встановіть OpenImageIO за допомогою команди git

 git clone https://github.com/OpenImageIO/oiio.git 

Читання та запис зображень через C++ API

Бібліотека OpenImageIO дозволяє програмістам читати та записувати зображення, а також керувати тим, як пізніші зображення створюватимуться зовнішніми вихідними даними. Зазвичай усі зображення, які читає бібліотека, зчитуються в ImageBuf, що підтримується базовим ImageCache, і автоматично перетворюються на плаваючі пікселі для внутрішнього зберігання. Під час запису зображень він просто виводить поточне зображення у вказаний файл. Бібліотека обробки зображень не видаляє поточне зображення зі стеку зображень; він просто зберігає його копію.

Розширене читання зображень через C++ API<

#include 
using namespace OIIO;
...
const char *filename = "foo.jpg";
auto inp = ImageInput::open (filename);
if (! inp) {
    std::cerr << "Could not open " << filename
              << ", error = " << OIIO::geterror() << "\n";
    return;
}
const ImageSpec &spec = inp->spec();
int xres = spec.width;
int yres = spec.height;
int channels = spec.nchannels;
std::vector pixels(xres * yres * channels);
if (! inp->read_image (TypeDesc::UINT8, &pixels[0])) {
    std::cerr << "Could not read pixels from " << filename
              << ", error = " << inp->geterror() << "\n";
    return;
}
if (! inp->close ()) {
    std::cerr << "Error closing " << filename
              << ", error = " << inp->geterror() << "\n";
    return;
}

Перетворення зображення в інші формати

Бібліотека OpenImageIO надає функції для конвертації зображень в інші популярні формати файлів. Це дуже легко конвертувати серед підтримуваних форматів зображень. Утиліта iconvert прочитає зображення, а потім запише зображення в новий підтримуваний формат файлу. Він просто визначить формат файлу з розширення файлу. Ви можете включити підпис до зображення, опис, ключові слова або метадані.

Змінити метадані зображення за допомогою C++

OpenImageIO API дозволяє розробникам програмного забезпечення змінювати поточні метадані зображення у своїх власних програмах C++ через API з відкритим кодом. Він надає команди, які змінюють метадані існуючого зображення, але не змінюють значення його пікселів. Хороша річ полягає в тому, що це впливає лише на поточне зображення (зображення у верхній частині стека), але не вниз по стеку. Ви також можете додати або видалити ключові слова, додати підпис або опис, видалити будь-які метадані тощо.

Як встановити метадані зображення через C++

// spec["key"] = value  sets the value of the metadata, using
// the type of value as a guide for the type of the metadata.
spec["Orientation"] = 1;   // int
spec["PixelAspectRatio"] = 1.0f;   // float
spec["ImageDescription"] = "selfie";  // string
spec["worldtocamera"] = Imath::M44f(...)  // matrix

Накладні форми або текст над зображеннями через C++ API

Завжди дуже корисний для маркування Ваших зображень з корисними назвами або водяними знаками зображення для захисту їх від несанкціонованого використання. Русский EnglishРусскийУкраїнськаPolskiItalianoEspañol汉语Bahasa Indonesiaहिन्दीPortuguês日本語DeutschFrançaisภาษาไทยελληνικά اللغة العربية Ви можете малювати форми над вашим зображенням або додати текст до нього лише пару рядків коду. Приклади коду показує, як намалювати текст над зображенням і вирівняти його.

Як намалювати текст над зображенням через C++ API

ImageBufAlgo::render_text (ImgA, 50, 100, "Hello, world");
float red[] = { 1, 0, 0, 1 };
ImageBufAlgo::render_text (ImgA, 100, 200, "Go Big Red!",
                           60, "Arial Bold", red);
float white[] = { 1, 1, 1, 1 };
ImageBufAlgo::render_text (ImgB, 320, 240, "Centered",
                           60, "Arial Bold", white,
                           TextAlignX::Center, TextAlignY::Center);
 Українська