Bitmap, tableau de stockage ....

cs_dami Messages postés 2 Date d'inscription mardi 5 novembre 2002 Statut Membre Dernière intervention 6 novembre 2002 - 5 nov. 2002 à 11:10
cs_taha18 Messages postés 1 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 28 février 2004 - 28 févr. 2004 à 20:50
Bonjour a tous.

Pour les besoins d'OpenGL, j'ai besoin de transformer mon Jpeg en BMP puis de stocker le BMP sous forme de tableau.
J'ai récupéré et analysé 1000 fois une fonction trouvé sur internet, mais je ne comprend pas certaines lignes ....
Je vous copie le code, je met des etoiles sur les lignes que j'interprete mal ...

merci de votre aide
Dami
function LoadJPGTexture(Filename: String; var Texture: GLuint; LoadFromResource : Boolean): Boolean;
var
Data : Array of LongWord;
W, Width : Integer;
H, Height : Integer;
BMP : TBitmap;
JPG : TJPEGImage;
C : LongWord;
Line : ^LongWord;
ResStream : TResourceStream; // used for loading from resource
begin
result :=FALSE;
JPG:=TJPEGImage.Create;

// Create Bitmap
BMP:=TBitmap.Create;
BMP.pixelformat:=pf32bit;
BMP.width:=JPG.width;
BMP.height:=JPG.height;
BMP.canvas.draw(0,0,JPG); // Copy the JPEG onto the Bitmap

// BMP.SaveToFile('D:\test.bmp');
Width :=BMP.Width;
Height :=BMP.Height;
SetLength(Data, Width*Height);

For H:=0 to Height-1 do
Begin
* Line :=BMP.scanline[Height-H-1]; // flip JPEG
For W:=0 to Width-1 do
Begin
* c:=Line^ and $FFFFFF; // Need to do a color swap
* Data[W+(H*Width)] :=(((c and $FF) shl 16)+(c shr 16)*+ (c and $FF00)) or $FF000000; // 4 channel.
* inc(Line);
End;
End;

BMP.free;
JPG.free;

Texture :=CreateTexture(Width, Height, GL_RGBA, addr(Data[0]));
result :=TRUE;
end;

3 réponses

cs_Nono40 Messages postés 962 Date d'inscription mercredi 3 avril 2002 Statut Membre Dernière intervention 12 septembre 2006 2
6 nov. 2002 à 01:10
Bon une petite remarque avant d'expliquer :
POSE LA QUESTION UNE SEULE FOIS STP !!!!!

Explications :
Un bitmap, est presque par définition un tableau de pixel, chaque pixel représente un point sur l'écran. Suivant le type du bitmap, chaque pixel est représenté par :
- 8bits/points : chaque pixel est une entrée dans une palettes de 256 couleurs ( moins utilisé maintenant ... )
- 24bits/points : chaque pixel est représenté par trois octects donnant chacun la valeur du vert, rouge et bleu. ( c'est le format le plus utilisé )
- 32bits/points : Même codage mais sur 4 octects, toujours un octet par couleur.

Dans le cas ici, c'est le format 32bits. Un bitmap est donc un tableau de Width de large et Height de haut d'entiers 32Bits. La représentation mémoire est effectuée par ligne, chaque ligne contient tous les pixels les uns derrière les autres. La propriété scanline fournis des pointeurs sur chacune des lignes. Sachant que ScanLine[0] est la ligne du bas du bitmap et ScanLine[Height-1] est la ligne du haut.

Dans la procédure, l'image Jpeg est copiée dans un bitmap pour pouvoir être lue facilement à l'aide de la propriété ScanLine :
BMP:=TBitmap.Create;
BMP.pixelformat:=pf32bit;
BMP.width:=JPG.width;
BMP.height:=JPG.height;
BMP.canvas.draw(0,0,JPG);

Ensuite pour envoyer les données à OpenGL, il faut que la texture soit contenu dans un tableau d'entier. Primo, le tableau est initialisé à la lougueur utilie :
Width :=BMP.Width;
Height :=BMP.Height;
SetLength(Data, Width*Height);

Pour remplir le tableau ainsi créé, le bitmap est exporé ligne par ligne en commençant par la ligne du haut :
For H:=0 to Height-1 do
Begin
Line :=BMP.scanline[Height-H-1];
Line représente ainsi un pointeur sur la ligne en cours. Line est un pointeur sur un type LongWord, donc Line^ contient la valeur du pixel en cours de copie. ( pour l'instant Line pointe sur le premier de la ligne ) Maintenant il faut boucler sur tous les points de la ligne :
For W:=0 to Width-1 do
Begin
c:=Line^ and $FFFFFF;
C est donc la valeur du pixel au format BGR ( blue-green-red), le masque est appliqué pour ne garder que la partie couleur du point. C contient alors le rouge dans l'octet de poids faible puis le vert puis le bleu et enfin 0 dans l'octet de poids fort. Or pour la fonction OpenGL il faire le bleu dans l'octet de poids faible, puis le vert, puis le rouge puis une valeur alpha de 255 dans l'octect de poids fort :
Data[W+(H*Width)] := // stockage dans le tableau
(((c and $FF) shl 16)+ // décalage du rouge vers la fin du mot
(c shr 16)+ // Décalage du bleu en début de mot
(c and $FF00)) // Le vert est conservé à sa place
or $FF000000; // Ajout de la comosante Alpha.

A la fin de chaque point, le pointeur en incrémenté sur le point suivant. Delphi autorise cette syntaxe, et incrémente la valeur de Line est fonction de son type. Comme Line pointe sur des entiers de quatre octets, automatiquement Delphi ajoute Quatre à la valeur de Line afin de pointer sur l'entier 32bits suivant :
inc(Line);
End;
End;

Enfin création de la texture :
Texture :=CreateTexture(Width, Height, GL_RGBA, addr(Data[0]));

--- :sleepy) Nono du Moulin :sleepy) ---
0
cs_dami Messages postés 2 Date d'inscription mardi 5 novembre 2002 Statut Membre Dernière intervention 6 novembre 2002
6 nov. 2002 à 11:05
merci beaucoup
0
cs_taha18 Messages postés 1 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 28 février 2004
28 févr. 2004 à 20:50
ben moi ca serai une kestion c komen tu fait pour afficher ton truk dans une fenetre opengl ....et jarrive po a trouver la nfunction creat texture de la fin

taha18
merci , davance
0
Rejoignez-nous