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