IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenGL Discussion :

Sauver le rendu sur un fichier image


Sujet :

OpenGL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Sauver le rendu sur un fichier image
    salut...

    j'ai créé un application de reconstrution 3D et j'aurais besoin de sauver ma reconstrution dans de fichiers de format image (jpeg, bmp....);;mais je ne suis pas trop expert en OpenGl..(en fait je developpe en Tao framework, un plateforme qui me permet de l'opengl c#)...
    et je ne sais pas si c'est possible et comment...


    vous avez des idées???

    merci bien..

    bonne journée..

  2. #2
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 387
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 387
    Points : 20 481
    Points
    20 481
    Par défaut
    Citation Envoyé par manco_0607
    salut...

    j'ai créé un application de reconstrution 3D et j'aurais besoin de sauver ma reconstrution dans de fichiers de format image (jpeg, bmp.
    Si tu est sous Windows et que tu as le HWND et le HDC de la fenêtre du rendu après c'est une banale utilisation des API win32.
    Même en C# avec GDI+ ça se fait en moins de 2

  3. #3
    Membre habitué Avatar de razmott
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 133
    Points : 142
    Points
    142
    Par défaut
    Salut !

    Une méthode simple existe (mais en C# je ne sais pas). Je te donne un petit code en C++ si ça peut t'aider :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    unsigned long SizeX = m_ResX;
    		unsigned long SizeY = m_ResY;
    		unsigned char *pixels = new unsigned char[SizeX * SizeY * 4];
    		glReadPixels(0,  0, SizeX, SizeY, GL_BGRA, GL_UNSIGNED_BYTE, pixels);
    		CImage Image(CVector2I(SizeX,SizeY), PXF_A8R8G8B8, pixels);
    		Image.Flip();
    		delete[] pixels;
    		return Image;
    PS : La classe CImage est inspirer de celle de Laurent Gomila.
    PS2 : pour sauver l'image utilise une bibliothèque ou une API capable de le faire.

    Bon coding !

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    merci...

    je vais essayé cette methode...

    mais je peux utiliser le Cimage en C#???

    ciao

    good time

  5. #5
    Membre habitué Avatar de razmott
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 133
    Points : 142
    Points
    142
    Par défaut
    Salut !

    La classe CImage est sur le principe simple te peut-être même trop compliquée pour l'utilisation que tu veux en faire. Basiquement, c'est un tableau de pixel avec quelques fonctions utiles (retourner l'image notament). Tu peux facilement coder ça, je pense. (De plus, je ne connais pas vraiment le C# )

    Bonne chance !

    @+

  6. #6
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 18
    Points : 12
    Points
    12
    Par défaut
    Voici la solution que j'ai utilisé en c#, pour te donner un ordre d'idée.
    démarche :
    - capture de la scène avec glreadpixels
    - creation d'un Bitmap en le remplissant pixel par pixel
    - enregistrement dans le format désiré

    capture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    //ici tu initialise avec la taille de ton controle opengl
    int v_screenshot_width = 640;
    int v_screenshot_heigth = 480;
    byte[] v_contenu_image = new byte[4*v_screenshot_width*v_screenshot_heigth];//ici le 4 est fixé par le fait que l'on va chercher les 4 composantes du RGBA
    Gl.glReadPixels(0, 0, v_screenshot_width, v_screenshot_heigth, Gl.GL_RGBA, Gl.GL_UNSIGNED_BYTE, v_contenu_image);
    remplissage de l'image
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    Bitmap v_image = new Bitmap(v_screenshot_width, v_screenshot_heigth);
    for(int i=0; i<v_screenshot_heigth; i++)//numéro de ligne
    {
    	for(int j=0; j<v_screenshot_width; j++)//numéro de colonne
    	{
                    //ici tu peux optimiser en nombre d'opérations en déclarant les entier en dehors de la boucle
                    //je ne l'ai pas fait par soucis de portée des variables, et du fait que meme avec une image énorme le traitement reste court
    		int v_taille_ligne = 4*v_screenshot_width;
    		int v_index_pixel = 4*j;
    		//l'ordre est determiné par le format de rapatriement (GL_RGBA)
    		int v_red	= v_contenu_image[(v_taille_ligne*i)+v_index_pixel];
    		int v_green = v_contenu_image[(v_taille_ligne*i)+v_index_pixel+1];
    		int v_blue	= v_contenu_image[(v_taille_ligne*i)+v_index_pixel+2];
    		int v_alpha	= v_contenu_image[(v_taille_ligne*i)+v_index_pixel+3];
    		v_image.SetPixel(j, (v_screenshot_heigth-1)-i, Color.FromArgb(v_alpha, v_red, v_green, v_blue));
    	}
    }
    sauvegarde de l'image
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    v_image.Save("C://mon_dossier//image.jpeg", ImageFormat.Jpeg);

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Merci
    merci bien a tous pour votre aide...

    j'ai resolu mes problems...;

    @+..

    goodTime

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Test sur un fichier image
    Par reventlov dans le forum Débuter
    Réponses: 1
    Dernier message: 06/10/2008, 22h39
  2. Réponses: 10
    Dernier message: 19/08/2008, 09h10
  3. Sauver des shapes sur une image (vb6)
    Par titella dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 02/12/2007, 10h53
  4. Sauver un TCanvas dans un fichier image (jpg, bmp, etc.)
    Par Angrim dans le forum C++Builder
    Réponses: 2
    Dernier message: 30/11/2007, 19h34
  5. Métadonnées sur fichier image
    Par airod dans le forum Calcul scientifique
    Réponses: 3
    Dernier message: 02/12/2005, 22h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo