1. Avant-propos :
Pour Delphi, si vous souhaitez dessiner des images, vous devez d'abord les traiter et vous devez référencer d'autres unités, qui ne sont pas incluses dans Delphi, vous devez donc télécharger Gl.pas séparément. L'unité OpenGl que l'on trouve couramment sur Internet est encapsulée dans la version 1.0, et cette fonction n'est pas déclarée. Les unités Gl.pas peuvent être trouvées en ligne. De plus, une unité Glaux.pas et glaux.dll sont requises, qui sont des bibliothèques auxiliaires. Un téléchargement sera fourni à la fin de cet article.
2. Processus de mise en œuvre :
Peindre des images nécessite les processus suivants. Le dessin de Windows est basé sur des bitmaps, tels que png, jpg, etc. Lors du dessin, il peut être converti en bmp puis dessiné.
1. Chargez les images bmp : utilisez auxDIBImageLoadA ou d'autres fonctions
2. Convertir en texture : glGenTextures -> glBindTexture -> glTexImage2D, glTexParameteri est utilisé pour définir les paramètres associés
3. Dessinez la texture : glBindTexture -> glBegin(GL_QUADS) -> glTexCoord2f -> glVertex2f -> glEnd
3. Dessinez à l'aide de la fonction glDrawPixels
glDrawPixels a les 5 paramètres suivants :
width : largeur de l’image du tableau
height : hauteur de l'image du tableau
format : format de stockage des données des images du tableau
type : inconnu
pixels : pointeur vers les données DIB
L'exemple de code est le suivant :
procédure TForm1.Draw;var Bmp: TBitmap;begin Bmp := TBitmap.Create; / Les données d'image de TBitmap sont stockées en continu dans la mémoire dans l'ordre inverse des lignes. La première adresse, qui est l'adresse du tampon d'image, peut être obtenue via TBitmap.ScanLine[TBitmap.Height-1] // La couleur de l'image bmp est. stocké dans bgr, vous devez donc sélectionner GL_BGR_EXT comme paramètre glDrawPixels(Bmp.Width, Bmp.Height, GL_BGR_EXT, GL_UNSIGNED_BYTE, Bmp.ScanLine[Bmp.Hauteur - 1]); SwapBuffers(FDC);
Vous n'avez pas besoin d'activer le mappage de texture pour dessiner des images en utilisant la méthode ci-dessus. Vous pouvez utiliser la fonction glPixelZoom pour zoomer sur l'image. La position d'affichage est dans le coin inférieur gauche de la fenêtre (je ne sais pas comment changer l'image). position pour le moment.)
3. Utilisez le dessin de texture
Si vous souhaitez contrôler la position d'affichage et le zoom de l'image, vous pouvez utiliser les méthodes suivantes.
1. Selon le processus, nous chargeons d'abord l'image dans le programme et obtenons les informations pertinentes sur l'image .
Pour charger des images dans des textures, veuillez vous référer à ce site://www.VeVB.COm/article/52125.htm
Le chargement d'un bitmap dans Delphi est très simple et peut être chargé des manières suivantes :
(1) Chargez l'image via la fonction auxDIBImageLoadA de la bibliothèque auxiliaire. Le retour est un pointeur de données PTAUX_RGBImageRec et le format de données DIB est RVB.
// Structure de données RVB TAUX_RGBImageRec = taille d'enregistrement .bmp')); // Comment libérer p ? Ni Dispose ni Freemem ne peuvent faire fonctionner cette extrémité de pointeur ;
(2) Chargez les images via TBitmap.LoadFromFile. Delphi l'accompagne. D'après une comparaison d'efficacité, les performances sont les mêmes que celles de auxDIBImageLoadA, mais le format de données DIB est BGR et le pointeur DIB est TBitmap.ScanLine[Bmp.Height - 1]
var Bmp: TBitmap;begin Bmp := TBitmap.Create; TBitmap.LoadFromFile(ExtractFilePath(ParamStr(0)) + '1.bmp'); // faire quelque chose // Libérer Bmp.Free;end;
2. Créez une texture , comprenant glGenTextures et glBindTexture, dans Gl.pas.
// Créer une zone de texture glGenTextures(1, @texture); // Lier la zone de texture glBindTexture(GL_TEXTURE_2D, texture); // Utiliser un bitmap pour créer une texture d'image glTexImage2D( GL_TEXTURE_2D, // La texture est une texture 2D GL_TEXTURE_2D 0, // Le niveau de détail de l'image est par défaut 0 3, // Le nombre de composants des données. Comme l'image est composée de rouge, de vert et de bleu, la valeur par défaut est 3 Bmp.Width, // La largeur de la texture Bmp.Height, // La hauteur de la texture est 0, / / La valeur de la bordure est 0 par défaut GL_BGR_EXT, // Le format de données bmp utilise bgr GL_UNSIGNED_BYTE, // Les données qui composent l'image sont de type octet non signé Bmp.ScanLine[Bmp.Height - 1] // Données DIB. pointeur); // Les deux lignes suivantes permettent à opengl d'utiliser la méthode de filtrage qu'OpenGL utilise lors de l'agrandissement de la texture originale (GL_TEXTURE_MAG_FILTER) ou de la réduction de la texture originale (GL_TEXTURE_MIN_FILTER). // GL_LINEAR utilise un filtrage linéaire pour lisser le traitement de l'image, mais nécessite plus de mémoire et de CPU glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // Filtrage linéaire glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
3. Dessinez des textures
Avant de dessiner une texture, OpenGL doit être averti pour activer le mappage de texture glEnable(GL_TEXTURE_2D). Lorsqu'il est activé, le dessin sans texture ne fonctionnera pas. N'oubliez pas de le fermer lorsque vous avez fini de l'utiliser.
// Ce qui suit est un dessin, en utilisant un quadrilatère pour dessiner une image // Active le mappage de texture si glIsEnabled(GL_TEXTURE_2D) = 0 then glEnable(GL_TEXTURE_2D); // Efface le tampon glClear(GL_COLOR_BUFFER_BIT ou GL_DEPTH_BUFFER_BIT); := 10; w := 200; Agrandissez l'image à 200*200 // Sélectionnez la texture. Si plusieurs textures sont utilisées dans la scène, la texture ne peut pas être liée entre glBegin() et glEnd() glBindTexture(GL_TEXTURE_2D, texture); de glTexCoord2f Un paramètre est la coordonnée X. // 0.0 est le côté gauche de la texture. 0,5 est le milieu de la texture et 1,0 est le côté droit de la texture. //Le deuxième paramètre de glTexCoord2f est la coordonnée Y. // 0.0 est le bas de la texture. 0,5 est le milieu de la texture et 1,0 est le haut de la texture. glTexCoord2f(0, 1); glVertex2f(l, t); glTexCoord2f(1, 1); glTexCoord2f(1, 0); 0, 0); glVertex2f(l, t + w); glFin();
Le dessin ci-dessus est terminé. Ce qui suit est le code complet dans Draw. Vous n'avez pas besoin de référencer la bibliothèque auxiliaire Glaux.pas.
procédure TForm1.Draw;var Bmp: TBitmap; texture: GLuint; l, t, w: Integer;begin Bmp := Bmp.LoadFromFile(ExtractFilePath(ParamStr(0)) + '1.bmp'); / Créer une zone de texture glGenTextures(1, @texture); // Lier la zone de texture glBindTexture(GL_TEXTURE_2D, texture); // Utiliser un bitmap pour créer une texture d'image glTexImage2D( GL_TEXTURE_2D, // La texture est une texture 2D GL_TEXTURE_2D 0, // Le niveau de détail de l'image est par défaut 0 3, / / Le nombre de composants des données Comme l'image est composée de rouge, de vert et de bleu, la valeur par défaut est 3 Bmp.Width, //. La largeur de la texture Bmp.Height, // La hauteur de la texture est 0, // La valeur de la bordure par défaut est 0 GL_BGR_EXT, // Le format de données bmp utilise bgr GL_UNSIGNED_BYTE, // Les données qui composent l'image est le type d'octet non signé Bmp.ScanLine[Bmp .Height - 1] // Pointeur de données DIB); Les deux lignes suivantes permettent à opengl d'utiliser la méthode de filtrage qu'OpenGL utilise lors de l'agrandissement de la texture originale (GL_TEXTURE_MAG_FILTER) ou de la réduction de la texture originale (GL_TEXTURE_MIN_FILTER). // GL_LINEAR utilise un filtrage linéaire pour lisser le traitement de l'image, mais nécessite plus de mémoire et de CPU glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // Filtrage linéaire glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // Filtrage linéaire// Ce qui suit est un dessin, en utilisant un quadrilatère pour dessiner une image // Activer le mappage de texture si glIsEnabled(GL_TEXTURE_2D) = 0 then glEnable(GL_TEXTURE_2D); // Effacer le tampon glClear(GL_COLOR_BUFFER_BIT ou GL_DEPTH_BUFFER_BIT); l := 10; 10 ; w := 200 ; Agrandissez l'image à 200*200 // Sélectionnez la texture. Si plusieurs textures sont utilisées dans la scène, la texture ne peut pas être liée entre glBegin() et glEnd() glBindTexture(GL_TEXTURE_2D, texture); de glTexCoord2f Un paramètre est la coordonnée X. // 0.0 est le côté gauche de la texture. 0,5 est le milieu de la texture et 1,0 est le côté droit de la texture. //Le deuxième paramètre de glTexCoord2f est la coordonnée Y. // 0.0 est le bas de la texture. 0,5 est le milieu de la texture et 1,0 est le haut de la texture. glTexCoord2f(0, 1); glVertex2f(l, t); glTexCoord2f(1, 1); glTexCoord2f(1, 0); 0, 0); glVertex2f(l, t + w); glEnd(); Bmp.Free; SwapBuffers(FDC);end;
Le code complet de cet exemple peut être téléchargé ici.