Обработка и преобразуване на изображения чрез 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 се предлага с няколко инструмента за изображения от команден ред, които демонстрират функции като конвертиране на формати на изображения в други, сравняване на две изображения, отпечатване на подробна информация, търсене на изображения за съответстващи метаданни, прост преглед на изображения и др.
Първи стъпки с 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
Винаги е много полезно да маркирате изображенията си с полезни заглавия или воден знак, за да ги предпазите от неразрешено използване. Отворената библиотека OpenImageIO включва няколко важни функции за рисуване на фигури, точки, линии, кутии или текст над изображенията с лекота. Можете да рисувате фигури върху изображението си или да добавяте текст към него само с няколко реда код. Следните примери за код показват как да нарисувате текст върху изображение и да го подравнявате.
Как да нарисувате текст върху изображение 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);