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 :

Rapidité de traitement d'image multi-plateforme [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur amateur
    Inscrit en
    Mai 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur amateur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2013
    Messages : 4
    Points : 6
    Points
    6
    Par défaut Rapidité de traitement d'image multi-plateforme
    Bonjour et meilleur voeux à tous et toutes,

    Il y a quelqueS annéeS (sic), je programmais en amateur en Delphi (3 à 6).
    J'essaye de m'y remettre avec Lazarus, dans un objectif multi-plateforme (Windows et Linux i386 et AMD64, voir Android sur smartphone)

    En ce moment, je fais joujou avec du traitement d'image et je souhaite travailler sans librairie extérieure (genre BGRABitmap ou Vampyre) pour essayer de me garantir au maximum le multi-plateforme.

    A la lecture de http://wiki.lazarus.freepascal.org/D..._with_Graphics,
    je me suis orienté sur l'utilisation de TLazIntfImage.
    La form a 2 TImage, un pour l'image d'origine, l'autre pour celle après retraitement.

    Un exemple de retraitement est le suivant (conversion en niveau de gris):
    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
    29
    30
    31
    32
    33
    34
    35
    36
     
    function ConvertToGreyScale(Src: TLazIntfImage): TLazIntfImage;
    // Direct BGRA access
    var
      tmp: TLazIntfImage;
      lRawImage: TRawImage;
      X,Y: integer;
      LSrc, LDst: Pointer;
      R, G, B, A: byte;
      Grey: byte;
    begin
      tmp:= TLazIntfImage.Create(0,0);
      Src.GetRawImage(lRawImage);
      tmp.SetRawImage(lRawImage);
     
        for Y:= 0 to Src.Height - 1 do
        begin
          LSrc:= Src.GetDataLineStart(Y);
          LDst:= tmp.GetDataLineStart(Y);
          for X:= 0 to Src.Width - 1 do
          begin
            B:= PByte(LSrc)[X*4];
            G:= PByte(LSrc)[X*4+1];
            R:= PByte(LSrc)[X*4+2];
            A:= PByte(LSrc)[X*4+3];
            Grey:= trunc((0.299*R) + (0.587*G) + (0.114*B));
            PByte(LDst)[X*4]:= Grey;
            PByte(LDst)[X*4+1]:= Grey;
            PByte(LDst)[X*4+2]:= Grey;
            PByte(LDst)[X*4+3]:= A;
            Application.ProcessMessages;
          end;
        end;
      end;
      Result:= tmp;
    end;
    Ce traitement prend 1,8s pour une image de 672x676 pixels sur un core i5 et passe à 3,8s sur un Atom. Je vous laisse imaginer dès que je prend une image plus grande.

    A la place des PByte, j'ai essayé avec des TFPColor ou des TRGBQuad (suite à vos échanges récent), sans avoir gagné en vitesse.

    J'en conclus que je m'y prend mal ou que je n'ai pas fait le bon choix avec TLazIntfImage.

    Avez-vous des suggestions, des pistes de recherches ?

    Merci d'avance.

    Jack.R

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 729
    Points : 15 133
    Points
    15 133
    Par défaut
    Yep !
    Citation Envoyé par Jack.R Voir le message
    (...) Application.ProcessMessages;
    Avez-vous des suggestions, des pistes de recherches ?
    Juste une : je note dans ta boucle X la présence de Application.ProcessMessages; qui est donc appelé à chaque passage.

    Je n'ai jamais fait de tests comparatifs mais j'ai souvent entendu dire que cet appel était "ralentisseur", même s'il est nécessaire pour ne pas figer l'appli.

    Une bonne solution consiste à l'appeler quand même, mais de temps en temps seulement, par exemple tous les 20 passages : if ( X mod 20 = 0 ) then Application.ProcessMessages;

    Rien à voir avec des traitements graphiques optimisés, je sais , mais c'est à tenter.
    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
    Développeur amateur
    Inscrit en
    Mai 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur amateur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2013
    Messages : 4
    Points : 6
    Points
    6
    Par défaut
    Ah ben M...., en commentant le Application.ProcessMessages, je passe de 1785 ms à 10ms sur mon image de 672x676 pixels et 148ms pour une de 3264x1840.

    Je vais revoir mon utilisation de Application.ProcessMessages !

    Merci

  4. #4
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Hello,

    De manière générale, il faut prendre en considération les aspects de performance de l'application au sens "affichage". Typiquement, les traitements pouvant être longs (c'est-à-dire monopolisant le processeur sur plusieurs dizaines de millisecondes) devraient être faits dans un thread séparé du thread principal de l'application, qui lui ne doit servir qu'à l'affichage (et qui gère donc les événements et les messages).

    Le thread en question peut implanter une méthode de comptage permettant d'alimenter une barre de progression par exemple, qui se situe sur la form principale.
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Développeur amateur
    Inscrit en
    Mai 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur amateur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2013
    Messages : 4
    Points : 6
    Points
    6
    Par défaut
    Bonsoir,

    Je viens de lire http://wiki.lazarus.freepascal.org/M...on_Tutorial/fr
    Je ne pense pas avoir besoin des thread sur l'application finale.
    Sur celle-ci, ce n'est pas utile, car c'est juste une application de recherche pour tester différents algorithme de traitement d'image afin d'essayer de trouver ce qui pourrait convenir pour mon projet, d'où l'attention portée sur le temps d'exécution des ces algorithmes.

    L'Application.ProcessMessages était surtout là pour que je puisse stopper proprement l'application si je me suis fourvoyé dans l'implémentation d'un algorithme.

    Merci pour la suggestion qui m'a permis de découvrir TThread

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Outils de développement multiplateforme
    Par jibe74 dans le forum Outils pour C & C++
    Réponses: 27
    Dernier message: 30/10/2006, 00h04
  2. Traitement d'images : quel langage?
    Par belasri dans le forum Langages de programmation
    Réponses: 19
    Dernier message: 07/10/2005, 09h59
  3. commande c++ pour le traitement d'images
    Par mateo.14 dans le forum MFC
    Réponses: 2
    Dernier message: 12/01/2005, 10h46
  4. [lib] Traitement d'images
    Par Gogoye dans le forum Multimédia
    Réponses: 4
    Dernier message: 19/11/2004, 16h15
  5. Traitements d'image sur PNG avec transparence
    Par Ingham dans le forum Langage
    Réponses: 16
    Dernier message: 02/08/2004, 16h42

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