1. מוצרים
  2.   תמונה
  3.   C++
  4.   OpenImageIO
 
  

עיבוד תמונה והמרה באמצעות קוד פתוח 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++

זה תמיד שימושי מאוד לתייג את התמונות שלך עם כותרות שימושיות או סימן מים לתמונה כדי להגן עליהם מפני שימוש בלתי מורשה. ספריית הקוד הפתוח OpenImageIO כללה מספר תכונות חשובות לציור צורות, נקודות, קווים, תיבות או טקסט מעל התמונות בקלות. אתה יכול לצייר צורות מעל התמונה שלך או להוסיף טקסט אליו רק כמה שורות קוד. דוגמאות הקוד הבאות מראות כיצד לצייר טקסט על פני תמונה וליישר אותו.

איך לצייר טקסט מעל תמונה דרך C++

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);
 עִברִית