Bonjour,
Suite à des recommandations, j'ai utilisé des images de type tlazintfimage (plus rapides que les tbitmap pour le traitement de pixels) dans mon programme. Mais de manière extrêmement aléatoire j'ai une erreur :
Si on suit l'endroit où le débugeur nous envoie, ça me met dans 'Intfgraphics' à la fonction suivante :FPImageException: 'failled to create handles'
Donc j'en déduis que c'est quand je fais un passage d'un tlazintfimage à un tbitmap que cela crée cette erreur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 procedure TLazIntfImage.CreateBitmaps(out ABitmap, AMask: HBitmap; ASkipMask: boolean); begin if not RawImage_CreateBitmaps(FRawImage, ABitmap, AMask, ASkipMask) then raise FPImageException.Create('Failed to create handles'); end;
Mais je n'ai aucune idée de ce qui crée cette erreur (sur internet, je n'ai trouvé que le fait de mal définir le tlazintfimage mais j'ai pris ma méthode du wiki et en vérifiant elle semble correcte).
Avec le fait que je n'ai aucune idée du format de mes images. Je ne sais pas si c'est ça qui crée le problème mais vu que je pense que c'est juste pour la taille de la plage mémoire, j'ai mis le format le plus grand possible (pour le trawimage). Juste pour préciser, j'ai testé avec d'autres format (avec ou sans le M1 dont je n'ai aucune idée de la signification).
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 var alazintimtankeface:tlazintfimage; procedure ctableauimage.initialiseimageevolutivetankeface; var lRawImage: TRawImage; i,j:integer; begin // create a TLazIntfImage with 32 bits per pixel, alpha 8bit, red 8 bit, green 8bit, blue 8bit, // Bits In Order: bit 0 is pixel 0, Top To Bottom: line 0 is top lRawImage.Init; lrawimage.Description.Init_BPP32_B8G8R8A8_M1_BIO_TTB(0,0); lRawImage.CreateData(false); alazintimtankeface:= TLazIntfImage.Create(0,0); try alazintimtankeface.SetRawImage(lRawImage); // Load an image from disk. alazintimtankeface.LoadFromFile('./images/image_bonhomme/imagebasetankeface.bmp'); // It uses the file extension to select the right registered image reader. debugln(['imagecreator ',alazintimtankeface.Width,' ',alazintimtankeface.Height]); // The AImage will be resized to the width, height of the loaded image. finally end; end;
Après, pour afficher mon image je fais :
Là encore, le seul truc que je peux faire en plus c'est de définir la taille de bitmappassage avant de m'en servir mais je pense pas que cela changera grand chose.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 procedure ctank.effacetank(acanvas:tcanvas;matcol:cmatricecollision); var i,j:integer; bitmappassage:tbitmap; begin imageevolutivetankeface(matcol); //fait des modification sur le tlazintfimage bitmappassage:= tbitmap.Create; bitmappassage.LoadFromIntfImage(tableaudimage.alazintimtankeface); aCanvas.draw(fx0-8,fy0-5,bitmappassage); //fx0 et fy0 sont des coordonnées entières end;
Et donc voilà, de temps à autre (ça peut être 20 min comme 15s) je reçois la fpimageexeption qui fait crasher le programme.
Donc je crée ce post en espérant que quelqu'un sache comment se débarrasser de ce problème.
ps: juste pour préciser, je suis sous Windows 7 si cela a une importance.
Partager