Alle C++-Beispiele zur Verfügung, um rohe Pixeldaten aus glReadPixels in JPEG-Format und zurück zu konvertieren?
Antworten
Zu viele Anzeigen?Verwenden Sie dafür eine externe Bibliothek.
Ich empfehle DevIL Ihr Schweizer Taschenmesser für den Umgang mit Bilddateien. Sie müssen nur
- über DevIL ein RGB-Bild im Speicher erstellen,
- aufrufen
glReadPixels
um Ihr DevIL-Bild mit Pixeln aus dem GL-Framebuffer zu füllen, - aufrufen
ilSaveImage("foo.jpg")
um die Datei zu speichern. Sie können auch verwendenbmp
,png
und eine Handvoll anderer - das Format wird automatisch aus dem Dateinamen erkannt.
Einfach.
Ich bin nicht sicher, ob OpenGL Unterstützung für den Umgang mit JPEG-Bildern hat. Es ist nicht, was die Bibliothek ist wirklich für.
Sobald Sie Zugang zu den Pixeldaten haben, sollten Sie in der Lage sein, die OpenCV um das Bild in JPEG (oder einem anderen Format) zu speichern. Hier ist ein Pseudocode, der Ihnen den Einstieg erleichtert.
/*
* On Linux, compile with:
*
* g++ -Wall -ggdb -I. -I/usr/include/opencv -L /usr/lib -lm -lcv -lhighgui -lcvaux filename.cpp -o filename.out
*/
#include <cv.h>
#include <highgui.h>
/*
* Your image dimensions.
*/
int width;
int height;
CvSize size = cvSize(width, height);
/*
* Create 3-channel image, unsigned 8-bit per channel.
*/
IplImage *image = cvCreateImage(size, IPL_DEPTH_8U, 3);
for (int i = 0; i < width; ++i)
for (int j = 0; j < height; ++j)
{
unsigned int r;
unsigned int g;
unsigned int b;
/*
* Call glReadPixels, grab your RGB data.
* Keep in mind that OpenCV stores things in BGR order.
*/
CvScalar bgr = cvScalar(b, g, r);
cvSet2D(image, i, j, bgr);
}
cvSaveImage("filename.jpg", image);
cvReleaseImage(&image);
Es gibt auch andere Bibliotheken für den Umgang mit JPEG, wenn Sie sich umsehen.