Bonjour,
J'ai crée une scène 3D avec OpenGL, et j'ai untilisé un simple menu Glut pour la manipulation de la scène.
Je veux savoir, comment capturer l'image avec OpenGL et la sauvegarder au format bmp?
Merci
Version imprimable
Bonjour,
J'ai crée une scène 3D avec OpenGL, et j'ai untilisé un simple menu Glut pour la manipulation de la scène.
Je veux savoir, comment capturer l'image avec OpenGL et la sauvegarder au format bmp?
Merci
A voir, mais la fonction glreadpixel peut peut être t'aider?
Bonsoir,
avec gl_readpixels tu peux récupérer les pixels de l'écran dans une structure ou assimilée (RGB, RGBA, ... y'a plusieurs paramètres possibles).
Ensuite, à toi de connaître le format de fichier et l'encodage nécessaire pour l'enregistrer correctement.
Bonjour,
En effet, la fonction glReadPixels() est la première et la solution la plus simple. Mais, j'ose croire qu'elle est légèrement lente.
Toutefois, vous pouvez aussi utiliser les Pixel Buffer Object (PBO) pour effectuer votre rendu dans un buffer et le récupérer coté CPU (pour en faire ce que vous voulez).
Bonjour,
Merci pour votre aide,
J'ai met le code suivant pour capturer l'écran à l'aide de la fonction glReadPixels
Cette fonction a pour objectif de récupérer tous les pixels de l'image, mais comment les sauvegarder dans une format bmp ou autre format?Code:
1
2
3
4
5 glReadBuffer(GL_BACK); data = malloc(GL_RGBA * 500 * 500); if( data ) { glReadPixels(0, 0, 500, 500, GL_RGBA, GL_UNSIGNED_BYTE, data); }
Pour la sauvegarde, il suffit d'écrire un fichier sur le disque. Le BMP reste le format un des plus facile à prendre en main
J'ai travaillé avec les fichiers texte seulement, donc j'ai aucune aidé sur la création d'un fichier image, est ce que vous pouvez me donner plus de détail, s'il vous plaît?
Il faut ouvrir le fichier en mode binaire, ensuite écrire l'entête du fichier (description du fichier image) et ensuite écrire les données de couleur (RGB(A))
Il y a plein d'exemple. La wiki est pas mal complète -> http://en.wikipedia.org/wiki/BMP_file_format
J'ai met ce code:
data est un pointeur de type GLvoid, et fputc prend un entier comme paramètreCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 glReadBuffer(GL_BACK); data = malloc(GL_RGBA * w * h); if( data ) { glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, dat); } sprintf(file,"image.bmp",cpt); if ((img = fopen(file,"w")) != NULL) { for (j=h-1;j>=0;j--) { for (i=0;i<w;i++) { fputc(data[3*j*h+3*i+0],fptr); fputc(data[3*j*h+3*i+1],fptr); fputc(data[3*j*h+3*i+2],fptr); } } } fclose(fptr); counter++;
Comment corriger l'erreur?
Quelle erreur ? une erreur de compilation ?
De toute façon, là, vous n'écrivez pas l'entête du fichier, j'ai l'impression.
Oui, une erreur de compilation
Code:error C2664: 'fputc' : cannot convert parameter 1 from 'GLvoid' to 'int'
fwrite sera surement mieux à utiliser
un fichier doit respecter un format, BMP est simple mais il faut tout de même le respecter
pour le format du fichier, voir le lien wiki plus haut
Moi, je vois pas d'où il sort le fptr. Je croyais que le fichier était "img" ... enfin bref ... ce n'est pas une histoire d'écriture d'image ou d'OpenGL qui vous bloc, mais juste que vous avez écrit du code un peu aléatoirement, j'ai l'impression. Dans le code donnée, il y a dat, qui traine ... alors que c'est data :roll:
Tu débute en programmation ?Citation:
Elle reste la même erreur, aucune fonction d'écriture dans un fichier prend comme paramètre un type GLvoid.
comment écrire les pixels dans ce cas?
Tu peux déclarer une adresse avec void si tu connais pas le type , ce qui est le cas de glReadPixels (le type tu le désigne avec GL_UNSIGNED_BYTE en argument).
(Bref sinon revoir les pointeurs).
Pourquoi tu as mis GLvoid *dat ?Code:
1
2 glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, dat);
Par contre pas sur que GL_RGBA = 4.Code:
1
2 data = malloc(GL_RGBA * w * h);
C'est pas super compliqué on gros :
Par contre pour écriture elle n'est pas tous a fait exacte , en bitmap en doit écrire en BGR il me semble.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 char *data; data = malloc(4 * w * h); glReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, data); //code fopen , ecriture de entete. for(i = 0;i < w*h*4;i++) { fputc(data[i],file); } free(data);
Quitte à écrire les données dans l'ordre, pourquoi diable faire une boucle pour faire un fputc alors qu'on a fwrite qui fait ça très bien ? :calim2:
GL_RGBA est un define qui est loin de valoir 4, il vaut 0x1908Code:
1
2
3
4
5
6 unsigned char* pDatas = malloc(3*width*height); glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, pixels); // fopen // header, cf : wikipedia sur le format bmp (bis repetita) fwrite((void*)pDatas, 1, 3*width*height, file); free(pDatas);
edit: amha le mieux est qd mm d'avoir une struct Pixel { unsigned char r,g,b; }; afin de réordonner aisément RGB en BGR ou quoi que ce soit ce dont on a besoin :)
Salut,
si tu n'as pas peur des dépendances tu as aussi SOIL : http://www.lonesock.net/soil.html (crossplatform)
regardes la fonction "SOIL_save_screenshot"
Au plaisir