1. 产品
  2.   图片
  3.   C++
  4.   OpenImageIO
 
  

通过开源 C++ API 进行图像处理和转换

通过免费的 C++ 库读取、写入和转换流行的图像格式,如 PNG、JPEG、BMP、TIFF 等。

OpenImageIO是一个强大的图像处理库、使软件开发者能够在C++个应用程序中读取、写入和处理普遍图像文件格式。 它通过插件为几种常见的形象格式提供支持。 它支持公开交易、TIFF、JEG/FF、NG、BMPJPEG-2000、CO、D、FF3D等大众形象格式、共计GIF6、GIF。

OpenImageIO图书馆广泛应用于世界各地的动画和FX工作室、也被纳入了许多商业产品。 OpenImageIO图书馆配备了一些命令线图像工具、显示了将图像格式转换为其他形式的特点、比较了两幅图像、搜索元数据。

Previous Next

OpenImageIO 入门

OpenImageIO 构建系统基于 CMake。如果需要在您的系统上安装它。构建 OpenImageIO 后,如果使用 EMBEDPLUGINS=0 标志编译,则需要将环境变量 OIIO_LIBRARY_PATH 设置为指向安装 OpenImageIO 的“lib”目录,否则它将无法找到插件。

通过 git 命令安装 OpenImageIO

 git clone https://github.com/OpenImageIO/oiio.git 

通过 C++ API 读取和写入图像

OpenImageIO 库允许程序员读取和写入图像以及控制后续图像在输出中从外部生成的方式。通常,库读取的所有图像都被读取到由底层 ImageCache 支持的 ImageBuf 中,并自动转换为浮点像素以供内部存储。在写入图像时,它只是将当前图像输出到命名文件。图像处理库不会从图像堆栈中移除当前图像;它只是保存它的副本。

通过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++ 更改图像元数据

OpenImageIOAPI使软件开发者能够通过开放源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);
 中国人