IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lazarus Pascal Discussion :

Lenteur du chargement d'un TBitmap


Sujet :

Lazarus Pascal

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Octobre 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Octobre 2015
    Messages : 15
    Points : 5
    Points
    5
    Par défaut Lenteur du chargement d'un TBitmap
    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) .

    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.

    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
    20
    21
    22
    23
    24
     
    var FBitmap:Tbitmap;
      i:integer;
      M:TmemoryStream;
      D1,D2:TDateTime;
    begin
      M:=TmemoryStream.create;
      Image1.Picture.Bitmap.LoadFromFile('C:\Users\anonymous\Pictures\1.bmp');
      Image1.Picture.SaveToStream(M);
      M.Position:=0;
     
      FBitmap:= Tbitmap.Create;
      try
        D1:=Now;
        FBitmap.LoadFromStream(M);
        Image1.Picture.Assign(FBitmap);
        D2:=Now;
     
      finally
        FBitmap.free;
        M.free;
        memo1.Lines.Add( MilliSecondsBetween(D1,D2).ToString );
     
      end;

  2. #2
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 699
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 699
    Points : 15 042
    Points
    15 042
    Par défaut
    Salut,

    Essaie comme ça, pour voir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
      FBitmap:= Tbitmap.Create;
      try
        D1:=Now;
        FBitmap.BeginUpdate();
        FBitmap.LoadFromStream(M);
        Image1.Picture.Assign(FBitmap);
        FBitmap.EndUpdate();
        D2:=Now;
      finally
    Et joyeux Noël,

    Mais pourquoi ne pas charger directement le TPicture du TImage, pourquoi passer par le TBitmap et le TStream ?
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Octobre 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Octobre 2015
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    Bonjour,
    charger directement le TPicture du TImage donne le meme Resultat, c'est toujours lent.. et meme le code que tu m'as donner ca donne aussi la meme chose 700 ms .. Et joyeux Noël a vous aussi

    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
    20
    21
    22
    23
    24
    25
    26
     
    var FBitmap:Tbitmap;
      i:integer;
      M:TmemoryStream;
      D1,D2:TDateTime;
    begin
      M:=TmemoryStream.create;
      Image1.Picture.Bitmap.LoadFromFile('C:\Users\anonymous\Pictures\1.bmp');
      Image1.Picture.SaveToStream(M);
      M.Position:=0;
     
      FBitmap:= Tbitmap.Create;
      try
        D1:=Now;
        FBitmap.BeginUpdate();
        FBitmap.LoadFromStream(M);
        Image1.Picture.Assign(FBitmap);
        FBitmap.EndUpdate();
        D2:=Now;
     
      finally
        FBitmap.free;
        M.free;
        memo1.Lines.Add( MilliSecondsBetween(D1,D2).ToString );
     
      end;
    Nom : Capture d’écran 2020-12-25 à 11.57.01 AM.png
Affichages : 363
Taille : 10,1 Ko

  4. #4
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 699
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 699
    Points : 15 042
    Points
    15 042
    Par défaut
    Pour avancer, il faudrait savoir quelle ligne prend du temps. Donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
      FBitmap:= Tbitmap.Create;
      try
        D1:=Now;
        FBitmap.LoadFromStream(M);
        D2:=Now;
        Image1.Picture.Assign(FBitmap);
        D3:=Now;
      finally
        FBitmap.free;
        M.free;
        memo1.Lines.Add( MilliSecondsBetween(D1,D2).ToString );
        memo1.Lines.Add( MilliSecondsBetween(D2,D3).ToString );
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Octobre 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Octobre 2015
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    La ligne qui prend du temp c'est FBitmap.LoadFromStream(M);

    Nom : Capture d’écran 2020-12-25 à 12.31.36 PM.png
Affichages : 345
Taille : 12,5 Ko

  6. #6
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 699
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 699
    Points : 15 042
    Points
    15 042
    Par défaut
    D'accord.
    Citation Envoyé par Jipété Voir le message
    Mais pourquoi ne pas charger directement le TPicture du TImage, pourquoi passer par le TBitmap et le TStream ?
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  7. #7
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 062
    Points : 15 353
    Points
    15 353
    Billets dans le blog
    9
    Par défaut
    Bonjour !

    Comme Jipété, je conseillerais d'essayer la solution la plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.Button1Click(Sender: TObject);
    var
      D1, D2: TDateTime;
    begin
      D1 := Now;
      Image1.Picture.LoadFromFile('/home/roland/Images/image.bmp');
      D2 := Now;
      ShowMessage(MilliSecondsBetween(D1, D2).ToString);
    end;
    L'opération prend chez moi 35 ms.

    Notez bien que c'est Picture.LoadFromFile, et non pas Picture.Bitmap.LoadFromFile.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Octobre 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Octobre 2015
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    Bonjour,
    Dans le meilleur des cas j'ai 530 ms et ca peut yallé jusqua 700ms(comme j'avais dit c pareil ..)

    Nom : Capture d’écran 2020-12-26 à 9.17.14 AM.png
Affichages : 326
Taille : 72,5 Ko

  9. #9
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 699
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 699
    Points : 15 042
    Points
    15 042
    Par défaut
    Citation Envoyé par matrix1233 Voir le message
    Bonjour,
    Dans le meilleur des cas j'ai 530 ms et ça peut aller jusqu'à 700 ms
    Gros fichier ? Et comme ça ne veut rien dire, "poids" du fichier, stp.

    Éventuellement, fichier zippé en pièce jointe si ce n'est pas confidentiel -- et si c'est confidentiel tu floutes tout, l'important dans un .bmp c'est le nombre de pixels et si c'est monochrome ou RGB.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Octobre 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Octobre 2015
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    C'est une capture d'écrans ayant une taille 15M resolution 2880x1800 . ci-joint une capture d'écrans qui qui me donne 450 ms
    1.zip

  11. #11
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 699
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 699
    Points : 15 042
    Points
    15 042
    Par défaut
    Citation Envoyé par matrix1233 Voir le message
    C'est une capture d'écrans ayant une taille 15M resolution 2880x1800 . ci-joint une capture d'écrans qui me donne 450 ms
    1.zip
    Chez moi, chargement en 465 msec sur une machine pas toute jeune (10 ans d'âge environ) et un Linux 3.8 dans une Debian 7.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      d1 := now;
      Image1.Picture.LoadFromFile(chemin + '1.bmp');
      d2 := now;
      ShowMessage(IntToStr(MilliSecondsBetween(D1, D2))); // 465
    Il faudrait tester avec le chargement du fichier dans un stream, qui serait ensuite converti en TBitmap en remplissant les structures qui vont bien au moyen de Scanline et de pointeurs, c'est toute une histoire et je n'ai pas le temps, hélas.
    (dommage parce que c'est intéressant.)

    Dans un premier temps tu pourrais regarder combien de temps prend le chargement dans un stream :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      ms := TMemoryStream.Create;
      d1 := now;
      ms.LoadFromFile(chemin + '1.bmp');
      d2 := now;
      ShowMessage(IntToStr(MilliSecondsBetween(D1, D2))); // 17 seulement
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Octobre 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Octobre 2015
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    Dans le premier exemple que j'avais donné contient un chargement depuis un stream

  13. #13
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 699
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 699
    Points : 15 042
    Points
    15 042
    Par défaut
    Citation Envoyé par matrix1233 Voir le message
    Dans le premier exemple que j'avais donné contient un chargement depuis un stream
    Oui, mais ce qu'on ne sait pas, c'est comment le stream est transformé en bitmap !

    Si c'est à coups de scanline ça bombarde, mais si c'est avec des boucles de pixels[x, y] c'est la lenteur assurée...

    Parce que si tu regardes avec un éditeur hexa le contenu d'un stream enregistré sur le disque, tu vas y retrouver la structure d'un bitmap, le problème est ensuite de convertir toutes ces données en quelque chose de compréhensible par le TBitmap du TImage...

    Il y a sans doute des bouts de codes qui traînent sur le net, le tout est de les trouver (peut-être même dans le forum voisin, en recherchant scanline).
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  14. #14
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 062
    Points : 15 353
    Points
    15 353
    Billets dans le blog
    9
    Par défaut
    J'ai fait un test avec BGRABitmap (qui est multiplateforme) : le chargement semble être beaucoup plus rapide que par TImage.LoadFromFile.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TForm1.Button1Click(Sender: TObject);
    var
      bmp: TBGRABitmap;
      D1, D2: TDateTime;
    begin
      D1 := Now;
      //Image1.Picture.LoadFromFile('1.bmp');
      bmp := TBGRABitmap.Create('1.bmp');
      bmp.Draw(Image1.Canvas, 0, 0, True);
      D2 := Now;
      ShowMessage(MilliSecondsBetween(D1, D2).ToString);
      bmp.Free;
    end;
    À part ça je n'ai pas d'autre idée.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  15. #15
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 699
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 699
    Points : 15 042
    Points
    15 042
    Par défaut
    Rhôôôô, Roland !
    Citation Envoyé par Roland Chastain Voir le message
    le chargement semble être beaucoup plus rapide que par TImage.LoadFromFile.
    C'est combien, beaucoup plus rapide ?
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  16. #16
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 844
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 844
    Points : 11 274
    Points
    11 274
    Billets dans le blog
    6
    Par défaut
    Bonsoir,

    Sous W10 CodeTyphon 7.2 64 bits et le code suivant :
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Debut, Fin: TDateTime;
      Flux: TMemoryStream;
      bmp: TBitmap;
    begin
      Debut := Now;
      Image1.Picture.LoadFromFile('E:\Bureau\1.bmp');
      Fin := Now;
      Memo1.Append('Picture file load : ' + MilliSecondsBetween(Debut, Fin).ToString);
      Flux := TMemoryStream.Create;
      Debut := Now;
      Image1.Picture.SaveToStream(Flux);
      Fin := Now;
      Memo1.Append('Picture stream save : ' + MilliSecondsBetween(Debut, Fin).ToString);
      bmp := TBitmap.Create;
      Flux.Position := 0;
      Debut := Now;
      bmp.LoadFromStream(Flux, Flux.Size);
      Fin := Now;
      Memo1.Append('Bitmap stream load : ' + MilliSecondsBetween(Debut, Fin).ToString);
      Debut := Now;
      Image1.Picture.Assign(bmp);
      Fin := Now;
      Memo1.Append('Picture bitmap assign : ' + MilliSecondsBetween(Debut, Fin).ToString);
      bmp.Free;
      Flux.Free;
    end;
    j'obtiens :
    Picture file load : 299
    Picture stream save : 7
    Bitmap stream load : 296
    Picture bitmap assign : 4
    [EDIT] pas de temps gagné en utilisant Image1.Picture.LoadFromStreamWithFileExt(Flux, 'bmp');
    Delphi 5 Pro - Delphi 10.4 Rio Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  17. #17
    Futur Membre du Club
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Octobre 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Octobre 2015
    Messages : 15
    Points : 5
    Points
    5
    Par défaut
    300 ms c'est encore lents, J'ai deja obtenu 60 ms (Load + Assign) avec FBitmap:= TImagingBitmap.Create (utilisation de VampyreImaging).. je cherche un moyen de ne pas utiliser aucun composant et obtenir la meme chose

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
      FBitmap:= TImagingBitmap.Create;
      try
        D1:=Now;
        FBitmap.LoadFromStream(M);
        Image1.Picture.Assign(FBitmap);
        D2:=Now;
     
      finally
        FBitmap.free;
        M.free;
        memo1.Lines.Add( MilliSecondsBetween(D1,D2).ToString );
      end;

  18. #18
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 699
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 699
    Points : 15 042
    Points
    15 042
    Par défaut
    Bonsoir,

    Citation Envoyé par matrix1233 Voir le message
    300 ms c'est encore lent, j'ai déjà obtenu 60 ms (Load + Assign) avec FBitmap:= TImagingBitmap.Create (utilisation de VampyreImaging).
    J'ai regardé le code à la va-vite et c'est bien ce que je supposais : VampyreImaging s'appuie sur Scanline pour faire le boulot.

    Sinon, tout ça dépend aussi des machines, on ne peut rien comparer, juste donner des directions : 210 millisec avec ma vieille machine et l'extrait de code ci-dessous, seulement 80 avec la nouvelle (pas encore en prod', hélas) à base de proc AMD Ryzen 3 seulement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TForm1.Button3Click(Sender: TObject);
    var
      lii: TLazIntfImage; // http://wiki.freepascal.org/Developing_with_Graphics#TLazIntfImage.LoadFromFile
      d1,d2: TDateTime;
    begin
      if not opd.Execute then exit; // TOpenPictureDialog
     
      lii := TLazIntfImage.Create(0,0);
      try
        lii.DataDescription:=GetDescriptionFromDevice(0);
        d1 := now;
        lii.LoadFromFile(opd.FileName); 
        d2 := now;
        ShowMessage(IntToStr(MilliSecondsBetween(D1, D2))); // 210
    , Yves
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  19. #19
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Salut

    Citation Envoyé par matrix1233 Voir le message
    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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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


    Citation Envoyé par matrix1233 Voir le message
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  20. #20
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 844
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 844
    Points : 11 274
    Points
    11 274
    Billets dans le blog
    6
    Par défaut
    Salut Jipété !
    As-tu passé le bitmap dans un de tes décodeurs d'en-tête pour voir si spécificité ?
    Delphi 5 Pro - Delphi 10.4 Rio Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

Discussions similaires

  1. C'est trop lent car j'ai fait une bétise mais je ne sais pas ou
    Par JeromeSig dans le forum Général Python
    Réponses: 2
    Dernier message: 23/11/2017, 14h05
  2. Proxy HTTP - Très lent pour charger une page.
    Par astro01 dans le forum Réseau/Web
    Réponses: 4
    Dernier message: 16/05/2017, 00h22
  3. Code trop lent pour une écriture sur disque
    Par Anarchy64 dans le forum C
    Réponses: 6
    Dernier message: 12/12/2013, 20h54
  4. Le JPanel est trop reduit pour mon interface !
    Par LeNeutrino dans le forum JBuilder
    Réponses: 4
    Dernier message: 25/07/2005, 19h58
  5. [Info] Eclipse est-il gratuit pour développer une application ?
    Par kaishef dans le forum Eclipse Platform
    Réponses: 2
    Dernier message: 12/04/2005, 12h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo