Problème lors de création de bitmaps
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 :
Citation:
FPImageException: 'failled to create handles'
Si on suit l'endroit où le débugeur nous envoie, ça me met dans 'Intfgraphics' à la fonction suivante :
Code:
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; |
Donc j'en déduis que c'est quand je fais un passage d'un tlazintfimage à un tbitmap que cela crée cette erreur.
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).
Code:
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; |
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).
Après, pour afficher mon image je fais :
Code:
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; |
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.
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.