Salut
Envoyé par
matrix1233
Bonjour,
Je suis entrain de convertir une application Delphi vers Lazarus dans lequel j'ai une fonction qui charge une Image bitmap dans une TImage. Avec Delphi ca marche parfaitement mais avec Lazarus ça fonctionne mais il met 700 ms (presque une seconde). pour charger une image d'une MemoryStream vers une TImage.
Selon mes tests cette fonction met trop de temp ==> FBitmap.LoadFromStream(M); ( voir le code ci dessous pour le test) .
Il faut considérer que le système de gestion des Bitmaps avec Lazarus, et l'utilisation du TImage, ce n'est pas le top. Le schéma interne est très compliqué à cause de la gestion multi-plateforme (le format de stockage par exemple, n'est pas le même sous Windows, et Linux/Mac ==> BGRA vs RGBA)
En deux, c'est un peu normal que cela prenne du temps. Ton code n'est pas le mieux. Décortiquons ton code :
Phase 1 :
1 2 3 4
| M:=TmemoryStream.create;
Image1.Picture.Bitmap.LoadFromFile('C:\Users\anonymous\Pictures\1.bmp');
Image1.Picture.SaveToStream(M);
M.Position:=0; |
Ici tu charges ton image dans le TImage (ce qui est à la base long, car il passe par un TPicture, qui charge l'image dans un TBitmap et qui le passe dans le TImage)
Ensuite du sauve cette image dans ton stream.
Phase 2 :
1 2 3 4
| D1:=Now;
FBitmap.LoadFromStream(M);
Image1.Picture.Assign(FBitmap);
D2:=Now; |
Ici tu recharges ton image, déja chargée dans un TBitmap depuis ton précédent stream)Pour enfin le réassigner dans ton TImage
Tu as donc pas mal de "procedure en trop" et le fait que cela soit long, comme je le disais plus haut, ce sont les conversions vers le bon format à chaque fois
Envoyé par
matrix1233
J'ai poussé mes recherches et j'ai ajouté le composant VampyreImaging et j'ai utilisé FBitmap:= TImagingBitmap.Create; a la place de TBitmap et j'ai obtenu 60ms de temp pour chargement ! Je cherche un moyen d'utiliser le composant standard de Lazarus sans devoir utiliser une bibliothèque externe vu que je vise une application multiplatforme. Y a-t-il un moyen ? Merci d'avance.
Rien ne t'empêches d'utiliser une bibliothèque externe comme BGRABitmap ou la mienne BZScene (qui est très optimisée et plus rapide que le TBitmap natif et BGRABitmap pour le chargement des images, en passant) pour que ton application soit multi-plateforme.
Une chose que je ne saisie pas pourquoi utiliser un Stream et TBitmap supplémentaire (qui ne servent à rien, ici dans ton exemple) , si c'est juste pour afficher ton image dans un TImage ?
Juste
Image1.Picture.LoadFromFile('C:\Users\anonymous\Pictures\1.bmp');
suffit.
Donc que fait exactement ton application avec cette image, que souhaites tu faire, plus précisément ?
Bon dimanche
A+
Jérôme
Partager