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 :

Lire des Jpeg, Gif, Png pour texture (Delphi/C++ Builder)


Sujet :

OpenGL

  1. #1
    Membre régulier

    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 126
    Points : 107
    Points
    107
    Par défaut Lire des Jpeg, Gif, Png pour texture (Delphi/C++ Builder)
    Si je lis un fichier .bmp avec GlAux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
          pTextures := auxDIBImageLoadA( PChar(NomFichierBMP) );
    ... aucun problème. La primitive ci-après fonctionne correctement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
          glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB
                      , pTextures^.SizeX, pTextures^.SizeY      
                      , 0, GL_RGB, GL_UNSIGNED_BYTE
                      , pTextures^.Data);
    Si je lis un fichier Jpeg, Gif, Png pour en faire un BitMap (en Delphi)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
          ImageJPEG.LoadFromFile(NomFichierJPEG);
          BitMapJpeg.Assign(ImageJPEG);
    ...la même primitive fait planter le programme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
          glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB
                      , BitMapJpeg.Width, BitMapJpeg.Height      
                      , 0, GL_RGB, GL_UNSIGNED_BYTE
                      , @BitMapJpeg;
    La question que je me pose, c'est si je ne dois pas, après la lecture créer un buffer bitmap, basique, où tous les pixels se suivent à la queue-leuleu en bouclant sur le nombre de lignes et en utilisant la méthode scanline qui délivre un pointeur sur un buffer ligne (méthode analogue en C++Builder):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
          BitMapJPeg := TBitMap.create;
          try
            BitMapJPeg.LoadFromFile(NomFichierJPEG);
            for y := 0 to BitMapJPeg.Height -1 do
            begin
     
              P := BitMapJPeg.ScanLine[y];
     
          // ... transférer la ligne pointée par P dans un buffer basique.
    ... ou alors existe-t-il une librairie qui fait cela naturellement (apparemment GlAux ne lit que des .BMP)

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    La question que je me pose, c'est si je ne dois pas, après la lecture créer un buffer bitmap, basique, où tous les pixels se suivent à la queue-leuleu en bouclant sur le nombre de lignes et en utilisant la méthode scanline qui délivre un pointeur sur un buffer ligne (méthode analogue en C++Builder)
    C'est effectivement ce qu'attend glTexImage2D, et a priori l'adresse de BitMapJpeg n'est pas un tel tableau. Donc oui, faut soit copier à la main les pixels, soit récupérer à partir de ton objet BitMapJpeg une représentation similaire (contigüe) des pixels.

    ... ou alors existe-t-il une librairie qui fait cela naturellement (apparemment GlAux ne lit que des .BMP)
    DevIL (OpenIL -- c'est mieux pour Google), mais je ne pense pas que cela soit utilisable avec Delphi.

  3. #3
    Membre régulier

    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 126
    Points : 107
    Points
    107
    Par défaut
    Merci pour ta réponse rapide, comme à l'habitude, Loulou.

    Si scanline existe en Delphi et C++Builder, je pense que l'on ne peut accèder au buffer des pixels contigus que ligne par ligne.
    C'est donc ce que je vais faire.

  4. #4
    Membre régulier

    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 126
    Points : 107
    Points
    107
    Par défaut
    Comme j'ai ramé un certain temps avant de trouver la solution, je poste ici mon code final (Delphi) pour exploiter un fichier Jpeg en tant que texture.
    Cela pourrait intéresser des débutants comme moi.

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    type
        TPixelBuffer    = array of Byte;
        TptrPixelBuffer = ^TPixelBuffer;
    var
        PixelBuffer     : TPixelBuffer;
        ptrPixelBuffer  : TptrPixelBuffer;
     
        ImageJPEG       : TJpegImage;
        BitMapFichier   : TBitmap;
        Largeur,Hauteur : integer;
     
        i,j,c,x         : integer;
    ...
        ImageJPEG     := TJpegImage.Create;
        BitMapFichier := TBitmap.create;
        BitMapFichier.PixelFormat := pf24bit;
     
        {fichier JPEG lu dans <ImageJPEG> mais transféré aussitôt dans <BitMapFichier>}
        try
          ImageJPEG.LoadFromFile('fichier.jpg');
        except
          on EInvalidGraphic do imageJPEG := nil;
        end;
     
        if ( imageJPEG <> nil ) then begin
          {mettre l'image Jpeg dans <BitMapFichier>}
          BitMapFichier.Assign( ImageJPEG);
          Largeur := ImageJpeg.Width;
          Hauteur := ImageJpeg.Height;   
     
          {transférer les PIXELS à la queue leuleu dans le BUFFER <PixelBuffer>  dimensionné à raison de 3 octets par pixel}
     
          SetLength( PixelBuffer, Hauteur * Largeur * 3 );
          x  := 0;
          {la ligne 0 (haut de l'image) est lue en dernier}
          for i := Hauteur - 1 Downto 0 do begin
            pLine := BitMapFichier.ScanLine[i];
            for j := 0 to Largeur-1 do begin    
              {pour chaque Pixel de la ligne, on récupère dans l'ordre le BLEU, VERT, ROUGE  qu'il faut inverser}
              for c := 2 Downto 0 do begin
                PixelBuffer[x+c] :=  pLine^;
                inc(pLine);
              end;
              inc(x, 3);
            end;
          end;
        end;
        ImageJPEG.Free;
        BitMapFichier.Free;
    ...
        {le buffer <PixelBuffer> est maintenant directement exploitable en tant que texture dans la primitive glTexImage2D:}
     
        ptrPixelBuffer := @PixelBuffer;
        glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB
                    , Largeur, Hauteur
                    , 0, GL_RGB , GL_UNSIGNED_BYTE
                    , ptrPixelBuffer);

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

Discussions similaires

  1. [ImageMagick] Convertir des jpeg, gif en png
    Par WeDgEMasTeR dans le forum Bibliothèques et frameworks
    Réponses: 10
    Dernier message: 19/04/2006, 10h36
  2. structure des BMP,JPEG,GIF ...
    Par hutchuck dans le forum Imagerie
    Réponses: 2
    Dernier message: 22/10/2005, 20h03
  3. [32 bits] Redimensionner une image JPEG/GIF/PNG...
    Par CR_Gio dans le forum x86 32-bits / 64-bits
    Réponses: 2
    Dernier message: 04/10/2005, 00h57
  4. Comment afficher des JPEG dans une application Delphi ?
    Par Bouguennec dans le forum Composants VCL
    Réponses: 4
    Dernier message: 17/09/2005, 21h18
  5. Lire des images compressées pour Mac
    Par SpaceFrog dans le forum Autres Logiciels
    Réponses: 9
    Dernier message: 04/04/2005, 10h11

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