پردازش و تبدیل تصویر از طریق C++ API منبع باز
از طریق کتابخانه رایگان C++، فرمتهای تصویر محبوب مانند PNG، JPEG، BMP، TIFF و بسیاری دیگر را بخوانید، بنویسید و تبدیل کنید.
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);