begin process at 2010 03 12 18:21:59
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive Delphi

 > 

Archives

 > 

J'AI BESOIN D'AIDE !!!! :O

 > 

Bitmap, tableau de stockage ....


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Bitmap, tableau de stockage ....

mardi 5 novembre 2002 à 11:10:01 | Bitmap, tableau de stockage ....

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;
mercredi 6 novembre 2002 à 01:10:23 | Re : Bitmap, tableau de stockage ....

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;

mercredi 6 novembre 2002 à 11:05:17 | Re : Bitmap, tableau de stockage ....

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;


samedi 28 février 2004 à 20:50:26 | Re : Bitmap, tableau de stockage ....

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


Cette discussion est classée dans : width, jpg, bmp, height, bitmap


Répondre à ce message

Sujets en rapport avec ce message

Convertion d'un Jpeg en Bitmap puis stockage dans un tableau [ par 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 a Convertion d'un Jpeg en Bitmap puis stockage dans un tableau [ par 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 a Redimensionner une image [ par etrix ] Lut tout le monde ?ca va bien ?Alors voilà moi j'ai un ptit problème qui m'embête beaucoup :/ c'est pour cela que je fais appel à votre aide !J'ai déj Impression d'un bitmap : Page Blanche [ par Francky23012301 ] Salut à tous,Je travaille actuellement avec le composant TGraphXY de Kénavo. J'ai besoin de pouvoir l'imprimer en noir et blanc, j'utilise donc ce cod [Erreur Composant] [ par Bacterius ] Bonsoir, voici un cas fort interessant ... et bizarre. Je prépare un composant graphique descendant de TGraphicControl, une sorte de progressbar pour Un quickreport en metaFile [ par leroukin ] Bonjour,Le but de ma fonction est de générer un JPEG à partir des metafiles contenus dans mon objet QuickReport.voici la fonction :procedure TModuleEx [Composant] Diminution de la visibilité d'une propriété [ par Bacterius ] Bonjour, je suis en train de faire un composant ('rrahh toujours avec ses composants lui') visuel (pour changer) et j'ai un petit problème. Mon compos Message de sauvegarde [ par cincap ] Bonjour à tous,Est t'il possible de mettre un message d'avertissement au cas ou le fichier bmp ou jpg existerait avant de sauvegarder le nouveau fichi conversion bmp en jpg [ par raneria ] salut tt le monde!!! comment fait-on pour convertir une image bitmap de grande taille ( Ex: 1280x1024) en jpeg. Merci!!!


Nos sponsors


Appels d'offres

Sondage...

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,778 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales