begin process at 2008 08 20 15:24:43
1 228 895 membres
260 nouveaux aujourd'hui
14 259 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Bitmap, tableau de stockage .... [ Archives / J'AI BESOIN D'AIDE !!!! :O ] (dami)

Bitmap, tableau de stockage .... le 05/11/2002 11:10:01

dami
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;

Re : Bitmap, tableau de stockage .... le 06/11/2002 01:10:23

Nono40
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]));

--- Nono du Moulin ---


-------------------------------
Réponse au message :
-------------------------------

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;


Re : Bitmap, tableau de stockage .... le 06/11/2002 11:05:17

dami


merci beaucoup

-------------------------------
Réponse au message :
-------------------------------

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]));

--- Nono du Moulin ---


-------------------------------
Réponse au message :
-------------------------------

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;



Re : Bitmap, tableau de stockage .... le 28/02/2004 20:50:26

taha18
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


Classé sous : width, jpg, bmp, height, bitmap

Participer à cet échange

Livres en rapport

Pub



Appels d'offres

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS