1. produkty
  2.   obraz
  3.   C++
  4.   OpenImageIO
 
  

Zpracování a konverze obrazu přes Open Source C++ API

Čtěte, zapisujte a převádějte oblíbené obrazové formáty, jako jsou PNG, JPEG, BMP, TIFF a mnoho dalších, prostřednictvím bezplatné knihovny C++.

OpenImageIO je výkonná knihovna pro zpracování obrázků, která umožňuje vývojářům softwaru číst, zapisovat a zpracovávat oblíbené formáty souborů obrázků v aplikacích C++. Poskytuje podporu pro několik populárních obrazových formátů prostřednictvím zásuvných modulů. Poskytuje podporu pro oblíbené obrazové formáty jako OpenEXR, TIFF, JPEG/JFIF, PNG, BMP, JPEG-2000, ICO, PNM, DPX, IFF, Field3D, Ptex, Photoshop PSD, GIF a několik dalších.

Knihovna OpenImageIO je široce používána v animačních a VFX studiích po celém světě a je také integrována do mnoha komerčních produktů. Knihovna OpenImageIO je dodávána s několika nástroji pro obrázky z příkazového řádku, které demonstrují funkce, jako je převod obrazových formátů na jiné, porovnávání dvou obrázků, tisk podrobných informací, vyhledávání obrázků na metadata shody, jednoduchý prohlížeč obrázků a další.

Previous Next

Začínáme s OpenImageIO

Sestavovací systém OpenImageIO je založen na CMake. Pokud jej potřebujete nainstalovat do systému. Po sestavení OpenImageIO, pokud jste kompilovali s příznakem EMBEDPLUGINS=0, budete muset nastavit proměnnou prostředí OIIO_LIBRARY_PATH tak, aby ukazovala na adresář 'lib', kde je nainstalován OpenImageIO, jinak nebude moci najít pluginy.

Nainstalujte OpenImageIO pomocí příkazu git

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

Čtení a zápis obrázků přes C++ API

Knihovna OpenImageIO umožňuje programátorům číst a zapisovat obrázky a také řídit způsob, jakým budou pozdější obrázky externě vytvářeny na výstupu. Normálně jsou všechny obrázky čtené knihovnou načteny do ImageBuf podporované základní ImageCache a jsou automaticky převedeny na plovoucí pixely pro vnitřní úložiště. Při zápisu obrázků pouze vypíše aktuální obrázek do pojmenovaného souboru. Knihovna pro zpracování obrazu neodstraní aktuální obraz ze zásobníku obrazů; jednoduše uloží jeho kopii.

Pokročilé čtení obrazu přes 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;
}

Převod obrázku do jiných formátů

Knihovna OpenImageIO poskytuje funkce pro převod obrázků do jiných oblíbených formátů souborů. Je velmi snadné převádět mezi podporovanými formáty obrázků. Nástroj iconvert přečte obrázek a poté jej zapíše do nového podporovaného formátu souboru. Jednoduše odvodí formát souboru z přípony souboru. Můžete zahrnout popisek obrázku, popis, klíčová slova nebo metadata.

Změňte metadata obrázku pomocí C++

OpenImageIO API umožňuje softwarovým vývojářům měnit aktuální metadata obrázků uvnitř jejich vlastních aplikací C++ prostřednictvím open source API. Poskytuje příkazy, které upravují metadata existujícího obrázku, ale nemění jeho hodnoty v pixelech. Dobrá věc je, že je ovlivněn pouze aktuální obrázek (obrázek v horní části zásobníku), ale nikoli v dolní části zásobníku. Můžete také přidat nebo vymazat klíčová slova, přidat popis nebo popis, odstranit všechna metadata a další.

Jak nastavit obraz Metadata přes 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

Zákresy nebo text přes obrázky přes C++ API

Je vždy velmi užitečné označit obrázky s užitečnými tituly nebo vodoznakem obrázek pro ochranu před neoprávněným použitím. Open Source OpenImageIO knihovna obsahuje několik důležitých funkcí pro kreslení tvarů, bodů, linek, krabic nebo textu přes obrázky s lehkostí. Můžete kreslit tvary přes váš obrázek nebo přidat text do něj pouhým párem řádků kódu. Následující příklady kódu ukazuje, jak kreslit text nad obrazem a zarovnat jej.

Jak kreslit text přes obrázek přes 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);
 Čeština