1. สินค้า
  2.   ภาพ
  3.   C++
  4.   OpenImageIO
 
  

การประมวลผลภาพและการแปลงผ่าน Open Source C++ API

อ่าน เขียน และแปลงรูปแบบรูปภาพยอดนิยม เช่น PNG, JPEG, BMP, TIFF และอีกมากมายผ่านไลบรารี C++ ฟรี

OpenImageIO เป็นห้องสมุดการประมวลผลภาพที่มีประสิทธิภาพที่ช่วยให้ผู้พัฒนาซอฟต์แวร์ความสามารถในการอ่านเขียนและประมวลผลรูปแบบไฟล์ภาพยอดนิยมภายใน C++ โปรแกรม ให้การสนับสนุนสําหรับรูปแบบภาพที่นิยมหลายผ่านปลั๊กอิน มันให้การสนับสนุนสําหรับรูปแบบภาพที่เป็นที่นิยมเช่น OpenEXR, TIFF, JPEG / FF, NG, BMP, JPEG-2000, CO, PM, DP, FF, Field3D, Tex, Photoshop PSD, GIF และอื่น ๆ

ห้องสมุด OpenImageIO ใช้กันอย่างแพร่หลายในภาพเคลื่อนไหวและสตูดิโอ FX ทั่วโลกและยังรวมอยู่ในผลิตภัณฑ์เชิงพาณิชย์มากมาย ไลบรารี 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 ให้คําสั่งที่ปรับเปลี่ยนข้อมูลเมตาของภาพที่มีอยู่ แต่ไม่เปลี่ยนค่าพิกเซล สิ่งที่ดีคือเพียงภาพปัจจุบัน (ภาพที่ด้านบนของกอง) ได้รับผลกระทบ แต่ไม่ลงสแต็ค นอกจากนี้คุณยังสามารถเพิ่มหรือล้างคําหลักเพิ่มคําอธิบายหรือคําอธิบายลบข้อมูลเมตาและอื่น ๆ

วิธีการตั้งค่า Metadata ภาพผ่าน 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);
 ไทย