2010-11-18 23 views
2

Des exemples C++ disponibles pour convertir les données de pixels brutes obtenues à partir de glReadPixels au format JPEG et retour?opengl pixel data to jpeg

+0

Pourquoi cette balise JPEG2000 at-elle été ajoutée? JPEG et JPEG2K sont des bêtes complètement différentes. – Goz

+0

pouvons-nous le faire aussi dans jpeg2k? Je n'ai jamais utilisé jpeg2k. Des pointeurs? –

+0

jpeg2k est juste un autre format d'image avec perte. Faire ce que vous voulez "en jpeg2k" serait le même que n'importe quel autre format, en supposant que la bibliothèque que vous avez choisi d'utiliser le supporte (voir http://en.wikipedia.org/wiki/JPEG_2000 pour une liste des bibliothèques de support) . – misha

Répondre

2

Vous pouvez utiliser la bibliothèque ImageMagick pour convertir des données brutes en données d'image jpeg, et inversement. En utilisant la même bibliothèque, vous pouvez convertir les données d'image jpeg en données brutes (RVB).

0

Je ne suis pas sûr si OpenGL est compatible avec les images JPEG. Ce n'est pas ce que la bibliothèque est vraiment pour. Une fois que vous avez accès aux données de pixel, vous devriez pouvoir utiliser facilement OpenCV pour écrire l'image au format JPEG (ou tout autre format), cependant. Voici un pseudo-code pour vous lancer.

/* 
* 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); 

Autres bibliothèques pour traiter JPEG existent également, si vous regardez autour.

+0

Je pensais être libjpeg. –

+0

Oui, toute bibliothèque d'imagerie fera l'affaire. C'est une routine plutôt routinière, je doute que le code soit très différent. – misha

+0

Je n'ai trouvé aucune fonction de compression de mémoire dans libjpeg. Existe-t-il un code C++ qui s'affiche en compression/décompression de la mémoire (par opposition à l'écriture dans le fichier) –

1

Utilisez une bibliothèque externe pour cela.

Je recommanderai DevIL, votre couteau suisse numéro un pour la gestion des fichiers image. Vous aurez juste besoin de

  • créer une image RVB en mémoire via DevIL,
  • appel glReadPixels pour remplir l'image avec des pixels DevIL lus à partir du GL framebuffer,
  • appel ilSaveImage("foo.jpg") pour enregistrer le fichier. Vous pouvez également utiliser bmp, png et une poignée plus - le format sera détecté automatiquement à partir du nom de fichier.

Simple.