1. Produkty
  2.   Obraz
  3.   C++
  4.   OpenImageIO
 
  

Przetwarzanie i konwersja obrazu za pomocą Open Source C++ API

Czytaj, zapisuj i konwertuj popularne formaty obrazów, takie jak PNG, JPEG, BMP, TIFF i wiele innych, korzystając z bezpłatnej biblioteki C++.

OpenImageIO to potężna biblioteka przetwarzania obrazu, która daje programistom możliwość czytania, pisania i przetwarzania popularnych formatów plików graficznych w aplikacjach C++. Zapewnia obsługę kilku popularnych formatów graficznych za pośrednictwem wtyczek. Zapewnia obsługę popularnych formatów graficznych, takich jak OpenEXR, TIFF, JPEG/JFIF, PNG, BMP, JPEG-2000, ICO, PNM, DPX, IFF, Field3D, Ptex, Photoshop PSD, GIF i kilka innych.

Biblioteka OpenImageIO jest szeroko stosowana w studiach animacji i VFX na całym świecie, a także jest zintegrowana z wieloma produktami komercyjnymi. Biblioteka OpenImageIO zawiera kilka narzędzi graficznych wiersza poleceń, które demonstrują funkcje, takie jak konwertowanie formatów obrazów na inne, porównywanie dwóch obrazów, drukowanie szczegółowych informacji, wyszukiwanie obrazów pod kątem metadanych dopasowania, prosta przeglądarka obrazów i wiele innych.

Previous Next

Pierwsze kroki z OpenImageIO

System kompilacji OpenImageIO oparty jest na CMake. W razie potrzeby zainstaluj go w swoim systemie. Po skompilowaniu OpenImageIO, jeśli skompilowałeś z flagą EMBEDPLUGINS=0, będziesz musiał ustawić zmienną środowiskową OIIO_LIBRARY_PATH tak, aby wskazywała na katalog 'lib', w którym zainstalowano OpenImageIO, w przeciwnym razie nie będzie można znaleźć wtyczek.

Zainstaluj OpenImageIO za pomocą polecenia git

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

Odczytywanie i pisanie obrazów przez C++ API

Biblioteka OpenImageIO pozwala programistom odczytywać i zapisywać obrazy, a także kontrolować sposób, w jaki późniejsze obrazy będą zewnętrznie wytwarzane na wyjściu. Zwykle wszystkie obrazy odczytywane przez bibliotekę są odczytywane do ImageBuf obsługiwanego przez bazową ImageCache i są automatycznie konwertowane na piksele pływające w celu przechowywania wewnętrznego. Podczas zapisywania obrazów, po prostu wypisuje bieżący obraz do nazwanego pliku. Biblioteka przetwarzania obrazu nie usuwa bieżącego obrazu ze stosu obrazów; po prostu zapisuje jego kopię.

Zaawansowane czytanie obrazów przez 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;
}

Konwersja obrazu do innych formatów

Biblioteka OpenImageIO zapewnia funkcje konwersji obrazów do innych popularnych formatów plików. Konwersja obsługiwanych formatów graficznych jest bardzo łatwa. Narzędzie iconvert odczyta obraz, a następnie zapisze obraz w nowym obsługiwanym formacie pliku. Po prostu wywnioskuje format pliku z rozszerzenia pliku. Możesz dołączyć podpis obrazu, opis, słowa kluczowe lub metadane.

Zmień metadane obrazu za pomocą C++

OpenImageIO API umożliwia twórcom oprogramowania zmianę bieżących metadanych obrazu w ich własnych aplikacjach C++ za pośrednictwem interfejsu API typu open source. Udostępnia polecenia, które modyfikują metadane istniejącego obrazu, ale nie zmieniają jego wartości pikseli. Dobrą rzeczą jest to, że ma to wpływ tylko na bieżący obraz (obraz na górze stosu), ale nie na dół stosu. Możesz także dodać lub wyczyścić słowa kluczowe, dodać podpis lub opis, usunąć wszelkie metadane i nie tylko.

Jak ustawić Metadane obrazów przez 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

Narysuj kształty lub tekst nad obrazami przez C++ API

Jest to zawsze bardzo przydatne do etykietowania zdjęć z przydatnych tytułów lub znak wodny obraz do ochrony ich przed nieautoryzowanym użyciem. Otwarte źródło OpenImageIO biblioteka zawiera kilka ważnych funkcji do rysowania kształtów, punktów, linii, pudełek lub tekstu na obrazach z łatwością. Możesz narysować kształty na swoim obrazie lub dodać do niego tekst tylko kilkoma liniami kodu. Poniższe przykłady kodu pokazują jak rysować tekst na obrazie i dostosować go.

Jak rysować tekst na obrazie przez 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);
 Polski