معالجة الصور وتحويلها عبر 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 على نطاق واسع في استوديوهات الرسوم المتحركة والمؤثرات البصرية في جميع أنحاء العالم ، كما أنها مدمجة في العديد من المنتجات التجارية. تأتي مكتبة 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 ++ الخاصة بهم عبر واجهة برمجة التطبيقات مفتوحة المصدر. يوفر أوامر تقوم بتعديل البيانات الأولية للصورة الحالية ، لكن لا تغير قيم البكسل الخاصة بها. الشيء الجيد هو أن الصورة الحالية فقط (الصورة في الجزء العلوي من المكدس) هي التي تتأثر ، ولكن ليس أسفل المكدس. يمكنك أيضًا إضافة أو مسح الكلمات الأساسية ، وإضافة تسمية توضيحية أو وصف ، وإزالة أي بيانات وصفية ، والمزيد.
كيفية تعيين البيانات الوصفية للصورة عبر 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);