Arbeiten mit Bildern in C++: Überblick über Bibliotheken und praktische Beispiele
Die Verarbeitung digitaler Bilder ist eine der zentralen Aufgaben der modernen Programmierung. In C++ gibt es mehrere leistungsstarke Bibliotheken, mit denen Bilder geladen, bearbeitet, analysiert und gespeichert werden können. In diesem Artikel betrachten wir drei der beliebtesten Werkzeuge: CImg (leicht und einfach), OpenCV (Industriestandard für Computer Vision) und GraphicsMagick (für leistungsstarke Konvertierung).
1. CImg – Leichte Bibliothek für grundlegende Operationen
CImg (The C++ Template Image Processing Library) ist eine Header-Only-Bibliothek, die keine zusätzlichen DLLs erfordert. Sie eignet sich ideal für Studienprojekte und schnelles Prototyping. Unterstützt die Formate BMP, PNG, JPEG, TIFF (über externe Codecs).
Installation
Es genügt, die Datei CImg.h herunterzuladen und in das Projekt einzubinden. Für die Arbeit mit JPEG/PNG werden zusätzlich libjpeg, libpng und zlib benötigt.
Beispiel: Laden, Farbinvertierung und Speichern
#include "CImg.h"using namespace cimg_library;
int main() { // Bild laden CImg<unsigned char> img("input.jpg"); // Farben invertieren (Pixel = 255 - Pixel) CImg<unsigned char> inverted = 255 - img; // Gaußschen Weichzeichner anwenden (Radius 3) CImg<unsigned char> blurred = img.get_blur(3); // Ergebnisse speichern inverted.save("inverted.jpg"); blurred.save("blurred.jpg"); return 0;}2. OpenCV – Leistungsstarkes Framework für Computer Vision
OpenCV (Open Source Computer Vision Library) ist der De-facto-Standard für Aufgaben der Erkennung, Objektdetektion und komplexen Bildverarbeitung. Es unterstützt hunderte Algorithmen, Arbeit mit Videos und neuronalen Netzen. Es ist plattformübergreifend.
Installation
Auf Ubuntu: sudo apt install libopencv-dev. Auf Windows über vcpkg oder das offizielle Installationsprogramm.
Beispiel: Kantenerkennung (Canny) und Größenänderung
#include <opencv2/opencv.hpp>using namespace cv;
int main() { // Bild einlesen Mat img = imread("photo.jpg"); if (img.empty()) return -1; // In Graustufen umwandeln Mat gray; cvtColor(img, gray, COLOR_BGR2GRAY); // Kantenerkennung mit dem Canny-Algorithmus Mat edges; Canny(gray, edges, 50, 150); // Größe auf 300x300 ändern Mat resized; resize(img, resized, Size(300, 300)); // Speichern und anzeigen imwrite("edges.jpg", edges); imshow("Original", img); waitKey(0); return 0;}3. GraphicsMagick – Schnelle Konvertierung und Stapelverarbeitung
GraphicsMagick ist ein Fork von ImageMagick, der auf Stabilität und Leistung ausgerichtet ist. Es wird für Massenkonvertierung, Größenänderung und Wasserzeichen verwendet. Arbeitet mit über 200 Formaten.
Installation
Über den Paketmanager: sudo apt install graphicsmagick. Für C++ wird die Bibliothek libgraphicsmagick++-dev benötigt.
Beispiel: Bildverkleinerung und Konvertierung in PNG
#include <Magick++.h>using namespace Magick;
int main() { InitializeMagick(nullptr); // Bild laden Image image("input.tiff"); // Skalierung auf 800 Pixel Breite image.scale(Geometry("800x")); // Drehung um 90 Grad image.rotate(90); // JPEG-Qualität einstellen (falls Ausgabeformat JPEG ist) image.quality(85); // Als PNG speichern image.write("output.png"); return 0;}Vergleich der Bibliotheken
- CImg – einfacher Einstieg, minimaler