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

Delphi Discussion :

Comment localiser 1 portion d'image sur l'écran ?


Sujet :

Delphi

  1. #41
    Membre Expert
    Avatar de Charly910
    Homme Profil pro
    Ingénieur TP
    Inscrit en
    Décembre 2006
    Messages
    2 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur TP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 483
    Par défaut
    Bonjour,

    Ok bug de Andornot corrigé, mais voici un nouveau test (B9.bmp et P1.bmp) qui plante dans les 2 versions de Cirec. C'est quand le rectangle rouge mord d'un pixel sur le bas du Bmp. Avec Andornot, ça marche P1 n'est pas trouvé.

    Pour Jipété, je mets aussi mon propre B3.bmp)

    ça doit être encore un Pb de borne qui provoque un dépassement ou une violation d'accès.

    je vais essayer de traquer le bug

    A+
    Charly

  2. #42
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 097
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 097
    Par défaut
    Citation Envoyé par Cirec Voir le message
    ps: peut-on modifier le contenu d'un Zip ou faut-il à chaque fois en poster un nouveau ?
    Pour le modifier il faut que tu l'ouvres, donc que tu le rapatries et que tu le repostes. Autant poster directement un nouveau fichier.

    Citation Envoyé par Cirec Voir le message
    pour la G3.bmp comme toi je ne l'ai pas trouvé .. j'en ai donc créé une
    Pièce jointe 474858
    Bien impaire dans les deux dimensions, comme je les aime,

    Bon, l'algo d'andnotor a trouvé, j'ai supprimé les -1 en surnombre, ça trouve tout ce que ça doit trouver.

    Et si jamais un jour un linuxien avec Lazarus passait par là (si si, ça leur arrive de fouiner dans Delphi, il y a toujours des trucs à apprendre), un truc qui m'a un peu retardé, au début :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
            for h2 := 1 to B2.Height -1 do
            begin
              P21 := B2.ScanLine[h2];
     
              {$IFDEF LINUX}
              Inc(P11, BpS); // OS-dépendant !
              {$ELSE}
              Dec(P11, BpS); // OS-dépendant !
              {$ENDIF}
     
              Found := CompareMem(P11, P21, B2.Width *3);

  3. #43
    Membre émérite
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Par défaut
    Citation Envoyé par anapurna Voir le message
    salut

    cirec dans ton algo il y a une faille si tu as deux début de motif identique sur la première ligne
    tu ne visiteras jamais le deuxième motif
    le fait d'initialisé Ipos a 0 pour chaque boucle t’empêche de visiter toutes la ligne
    tout à fait encore ...
    correction:
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    procedure Tfrm_ImgSearchMain.btn_DeepSearchClick(Sender: TObject);
    var
      BpS1, BpS2, I, J, IPos,
        SPos       : Integer;
      R            : TRect;
      Str1, Str2   : Ansistring;
      Time1        : Int64;
      Found, LineEnd: boolean;
    begin
      Time1 := MyGetTickCount;
      BpS2 := Image2.Picture.Bitmap.Width * 3;
      SetLength(Str2, BpS2);
     
      SPos := 0;
      MoveMemory(PByte(@Str2[1]), Image2.Picture.Bitmap.ScanLine[SPos], BpS2);
     
      R := Rect(0, 0, Image2.Picture.Bitmap.Width, Image2.Picture.Bitmap.Height);
     
      BpS1 := Image1.Picture.Bitmap.Width * 3;
      SetLength(Str1, BpS1);
     
      for I := 0 to Image1.Picture.Bitmap.Height - Image2.Picture.Bitmap.Height do
      begin
        MoveMemory(PByte(@Str1[1]), Image1.Picture.Bitmap.ScanLine[I], BpS1);
        IPos := 0;
        repeat
          repeat
            IPos := IPos + 1;
            IPos := PosEx(Str2, Str1, IPos);
          until (IPos = 0) or (IPos mod 3 = 1);
          if (IPos <> 0) then
          begin
            Found := True;
            for J := 1 to Image2.Picture.Bitmap.Height - 1 do
            begin
              MoveMemory(PByte(@Str2[1]), Image2.Picture.Bitmap.ScanLine[J], BpS2);
              MoveMemory(PByte(@Str1[1]), Image1.Picture.Bitmap.ScanLine[I + J], BpS1);
              SPos := PosEx(Str2, Str1, IPos);
              if (IPos <> SPos) then
              begin
                Found := False;
                Break;
              end;
            end;
            if Found then
            begin
              OffsetRect(R, IPos div 3, I);
              Caption := Format('%d', [MyGetTickCount - Time1]);
              Image1.Canvas.Rectangle(R);
              MessageDlg(Format('Concordance trouvée aux coordonées%sLeft: %d%sTop: %d', [#13#13,
                R.Left, #13, R.Top]), mtInformation, [mbOk], 0);
              Image1.Canvas.Rectangle(R);
              Exit;
            end;
          end;
     
          LineEnd := (IPos = 0) or (IPos >= (Image1.Picture.Bitmap.Width - Image2.Picture.Bitmap.Width)
            * 3);
          Inc(IPos, Image2.Picture.Bitmap.Width * 3);
        until LineEnd;
      end;
      MessageDlg('Fin de traitement. Concordance non trouvée', mtWarning, [mbOk], 0);
    end;
    Citation Envoyé par Charly910 Voir le message
    Bonjour,

    Ok bug de Andornot corrigé, mais voici un nouveau test (B9.bmp et P1.bmp) qui plante dans les 2 versions de Cirec. C'est quand le rectangle rouge mord d'un pixel sur le bas du Bmp. Avec Andornot, ça marche P1 n'est pas trouvé.

    Pour Jipété, je mets aussi mon propre B3.bmp)

    ça doit être encore un Pb de borne qui provoque un dépassement ou une violation d'accès.

    je vais essayer de traquer le bug

    A+
    Charly
    ce problème devrait également être résolu (je me méfie maintenant )

    Cordialement,
    @+

  4. #44
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 479
    Par défaut
    salut

    c'est pas mal ... sauf que ce n'est pas bon ^^
    tu incrémente de la largeur du motif cherché alors que l’incrément devrais être de 3 imagine que ton motif cherche un carrée blanc
    qui fasse 3 de large et 4 de haut dans ton dessin originale tu ai
    un ligne de 4 carré blanc ... bin tu trouveras pas le motifs car tu as fait un déplacement de la largeur de ton motif

    [B][B][B][B]
    [B]B[][B][B]
    [B][B][B][B]
    [N][B][B][B]

    parcontre j'aime bien nommée mes variable avec un nom parlant
    genre


    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    procedure Tfrm_ImgSearchMain.btn_DeepSearchClick(Sender: TObject);
    var
      LstrOri, LStrPat, I, J, IPos,
      SPos       : Integer;
      R            : TRect;
      StrOri, StrPat   : Ansistring;
      Time1        : Int64;
      Found, LineEnd: boolean;
      WPat, HPat, WOri,HOri , 
      HVisite, WVisite : Integer;
    begin
      Time1 := MyGetTickCount;
      WPat := ImgPat.Picture.Bitmap.Width;
      HPat := ImgPat.Picture.Bitmap.Height;
      WOri := ImgOri.Picture.Bitmap.Width;
      HOri := ImgOri.Picture.Bitmap.Height; 
      
      LStrPat := WPat * 3;
      LStrOri := WOri * 3;
    
      SetLength(StrPat,LStrPat);
      SetLength(StrOri, LstrOri);
    
      
      MoveMemory(PByte(@StrPat[1]), ImgPat.Picture.Bitmap.ScanLine[0], LStrPat);
      R := Rect(0, 0, WPat,HPat);
      HVisite := HOri - HPat;
      WVisite := WOri - WPat;
      for I := 0 to HVisite do
      begin
        MoveMemory(PByte(@StrOri[1]), ImgOri.Picture.Bitmap.ScanLine[I], LstrOri);
        IPosFirst := 0;
        repeat
          /////////////////////////////////////
    	  repeat // on cherche la premiere ligne de motif
            IPosFirst := IPosFirst + 1;
            IPosFirst := PosEx(StrPat,StrOri, IPosFirst);
          until (IPosFirst = 0) or (IPosFirst mod 3 = 1);
    	  /////////////////////////////////////
          if (IPosFirst <> 0) then
          begin // si premier ligne trouvé alors on cherche le reste 
    	    ///////////////////////////////////// 
            Found := True;
            for J := 1 to HPat - 1 do
            begin
              MoveMemory(PByte(@StrPat[1]), ImgPat.Picture.Bitmap.ScanLine[J], LStrPat);
              MoveMemory(PByte(@StrOri[1]), ImgOri.Picture.Bitmap.ScanLine[I + J], LstrOri);
              SPos := PosEx(StrPat,StrOri, IPosFirst);
              if (IPosFirst <> SPos) then
              begin
                Found := False;
                Break;
              end;
            end;
    		/////////////////////////////////////
            if Found then
            begin  // ok occurance trouvé
              OffsetRect(R, IPosFirst div 3, I);
              Caption := Format('%d', [MyGetTickCount - Time1]);
              ImgOri.Canvas.Rectangle(R);
              MessageDlg(Format('Concordance trouvée aux coordonées%sLeft: %d%sTop: %d', [#13#13, R.Left, #13, R.Top]), mtInformation, [mbOk], 0);
              ImgOri.Canvas.Rectangle(R);
              Exit;
            end;
    		/////////////////////////////////////
          end;
          LineEnd := (IPosFirst = 0) or (IPosFirst >= (WVisite) * 3);
          Inc(IPosFirst, WPat * 3);// ici c'est pas bon 
        until LineEnd;
      end;
      MessageDlg('Fin de traitement. Concordance non trouvée', mtWarning, [mbOk], 0);
    end;

  5. #45
    Membre émérite
    Avatar de Cirec
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 467
    Par défaut
    Citation Envoyé par anapurna Voir le message
    salut

    c'est pas mal ... sauf que ce n'est pas bon ^^
    tu incrémente de la largeur du motif cherché alors que l’incrément devrais être de 3 imagine que ton motif cherche un carrée blanc
    qui fasse 3 de large et 4 de haut dans ton dessin originale tu ai
    un ligne de 4 carré blanc ... bin tu trouveras pas le motifs car tu as fait un déplacement de la largeur de ton motif
    ...
    Bonjour,


    je dis oui et c'est même tellement évident, maintenant que tu l'as dit, que je me demande comment j'ai pu passer à coté de ça !!!
    je ne pensais pas avoir perdu autant durant ces 5 mois de pause

    je vais devoir être plus vigilant à l'avenir

    en tout cas Merci à tous ceux qui ont pris le temps de débusquer mes erreurs et oublis

    Cordialement,
    @+

  6. #46
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 932
    Par défaut
    Hello à tous !
    Je reviens après 1 petite pause et je constate que mon modeste problème en intéresse plus d'un !

    Je vais tenter de compiler les ajouts/modifs successifs (sauf si quelqu'un l'a déjà fait ?) et vérifier avec ma config.

    Je précise, peut-être un peu tard que les images sont constituées à partir du même ordi.

    Je vous tiens au jus - merci.

  7. #47
    Membre Expert
    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
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Jipété Voir le message

    Et si jamais un jour un linuxien avec Lazarus passait par là (si si, ça leur arrive de fouiner dans Delphi, il y a toujours des trucs à apprendre), un truc qui m'a un peu retardé, au début :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
            for h2 := 1 to B2.Height -1 do
            begin
              P21 := B2.ScanLine[h2];
     
              {$IFDEF LINUX}
              Inc(P11, BpS); // OS-dépendant !
              {$ELSE}
              Dec(P11, BpS); // OS-dépendant !
              {$ENDIF}
     
              Found := CompareMem(P11, P21, B2.Width *3);
    Salut

    non, dans les deux OS c'est INC qu'il faut utiliser, car ici en faisant DEC tu testes la ligne précédente de P11 et plus aucune image est trouvée. ScanLine renvoie le début de la ligne, pas la fin

    PS : j'ai vérifié sous Windows, avant, au cas ou

    La fonction D'AndNotOr (légérement modifiée) fonctionne comme il se doit avec toutes les images de test présentes dans cet discussion

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    procedure TForm1.Button5Click(Sender : TObject);
    var
      Found            :boolean;
      B1, B2           :TBitmap;
      P1, P2, P11, P21 :PByte;
      BpS, BpS2              :integer;
      X1, Y1, Y2, YL,WL       :integer;
      R : TRect;
    begin
      Found := FALSE;
      B1    := Bmp1; Image1.Picture.Bitmap;
      B2    := Bmp2; Image2.Picture.Bitmap;
     
      P2 := B2.ScanLine[0];
      BpS   :=  BytesPerScanline(DimX1, 24, 32);  // Sous Lazarus (généralement) les données des images en 24bits sont alignées sur 32bits
      Bps2  := DimX2 * 3;
      YL := DimY1 - DimY2 ;
      WL := DimX1 - DimX2 ;
      for y1 := 0 to YL do
      begin
     
        P1 := B1.ScanLine[y1];
     
        for x1 := 0 to  WL do
        begin
          if CompareMem(P1, P2, Bps2) then
          begin
            P11 := P1;
     
            for y2 := 1 to DimY2 -1 do
            begin
     
              P21 := B2.ScanLine[y2];
              Inc(P11, BpS);
     
              Found := CompareMem(P11, P21, Bps2);
              if not Found then Break;
            end;
     
            if Found then
            begin
              Image1.Canvas.Pen.Color := clWhite;
              Image1.Canvas.Pen.Width := 2;
              Image1.Canvas.Pen.Mode := pmXor;
              Image1.Canvas.Brush.Style := bsClear;
              R := TRect.Create(Point(x1, y1),  DimX2,  DimY2);
              Image1.Canvas.Rectangle(R);
              MessageDlg(Format('Concordance trouvée aux coordonées%sLeft: %d%sTop: %d', [#13#13, x1, #13, y1]), mtInformation, [mbOk], 0);
              Image1.Canvas.Rectangle(R);
              Exit;
            end;
          end;
     
          Inc(P1, 3);
        end;
      end;
      ShowMessage('Pas trouvé !');
    end;
    A+
    • "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

  8. #48
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 097
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 097
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    non, dans les deux OS c'est INC qu'il faut utiliser, car ici en faisant DEC tu testes la ligne précédente de P11 et plus aucune image est trouvée. ScanLine renvoie le début de la ligne, pas la fin

    PS : j'ai vérifié sous Windows, avant, au cas ou
    Ah bon…

    Nom : trouvé.png
Affichages : 197
Taille : 127,9 Ko


    Nom : pas_trouvé.png
Affichages : 205
Taille : 128,1 Ko



    EDIT :
    et tu aurais dû te poser la question de savoir pourquoi Andnotor (qui est loin d'être un abruti) a utilisé Dec, alors.

    En fait tu as oublié un truc : sous Windows, le bitmap en général commence en bas, à Height-1, et pour monter jusquà Height=0, ben, faut décrementer, y a pas d'secret !
    Et sous Linux c'est l'inverse, il faut incrémenter pour descendre.
    EDIT de l'EDIT : marrant, on dit la même chose au même moment

    PS : il manque un {/QUOTE} dans ton post pour fermer le texte que tu m'attribues, juste avant ton "Salut".

  9. #49
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 914
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 914
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    non, dans les deux OS c'est INC qu'il faut utiliser
    Non ! Ça dépend de l'orientation du bitmap, tête en haut ou tête en bas. Il est habituellement tête en bas sous Windows (mais peut-être l'inverse sous Linux).
    Le pixel 0 est celui en bas à gauche de l'image. Celui en haut à gauche se situe à Height -1. La pseudo-boucle logique par rapport à ce qu'on voit à l'écran va donc de Height -1 downto 0 ce qui se traduit en pointeur par un Dec(P).

    On ne s'en rend pas compte mais lorsqu'on code (sous Windows) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for y := 0 to B.Height -1 do
        P := B1.ScanLine[y];
    on commence en fait par le ligne du bas de l'image.

    La propriété Transparent du TImage se base aussi sur le pixel en bas à gauche pour créer son masque de transparence, le premier pixel du bitmap.

    On peut contrôler l'orientation par le BITMAPINFOHEADER. Si biHeight est positif, il est tête en bas. Si négatif, il est tête en haut.

  10. #50
    Membre Expert
    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
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Ah bon…


    EDIT :
    et tu aurais dû te poser la question de savoir pourquoi Andnotor (qui est loin d'être un abruti) a utilisé Dec, alors.
    Citation Envoyé par Andnotor Voir le message
    Non ! Ça dépend de l'orientation du bitmap, tête en haut ou tête en bas. Il est habituellement tête en bas sous Windows (mais peut-être l'inverse sous Linux).
    Le pixel 0 est celui en bas à gauche de l'image. Celui en haut à gauche se situe à Height -1. La pseudo-boucle logique par rapport à ce qu'on voit à l'écran va donc de Height -1 downto 0 ce qui se traduit en pointeur par un Dec(P).

    On ne s'en rend pas compte mais lorsqu'on code (sous Windows) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for y := 0 to B.Height -1 do
        P := B1.ScanLine[y];
    on commence en fait par le ligne du bas de l'image.

    La propriété Transparent du TImage se base aussi sur le pixel en bas à gauche pour créer son masque de transparence, le premier pixel du bitmap.

    On peut contrôler l'orientation par le BITMAPINFOHEADER. Si biHeight est positif, il est tête en bas. Si négatif, il est tête en haut.
    Salut exacte

    Citation Envoyé par Jipété Voir le message

    En fait tu as oublié un truc : sous Windows, le bitmap en général commence en bas, à Height-1, et pour monter jusquà Height=0, ben, faut décrementer, y a pas d'secret !
    Et sous Linux c'est l'inverse, il faut incrémenter pour descendre.
    EDIT de l'EDIT : marrant, on dit la même chose au même moment
    Tu as oublié que Lazarus ne fonctionne pas comme Delphi surtout pour ce qui est de la gestion des Bitmap Donc pas besoin de {$IFDEF Linux} ici. INC c'est pour Linux et Windows avec Lazarus

    A+
    • "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

  11. #51
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 932
    Par défaut
    Bonjour à tous.

    Je vous reviens après une "petite" pause sur ce sujet (il n'est jamais trop tard).

    Après essai de la solution proposée (enrichie des derniers ajustements), je suis agréablement surpris par sa puissance, même si je n'ai que 50% de réussite (1 image sur 2 est trouvée). MAIS c'est peut-être dû aux conditions de réalisation: mon outil de capture produit des PNG qu'il m'a fallu enregistrer en BMP

    Pour autant, je constate une certaine dérive de l'approche depuis ce post dans lequel l'espace de recherche initial (l'écran) est devenu une image (TImage).

    Je suis tombé par hasard sur ce sujet qui pourrait permettre de considérer l'aire de la Form (maximisée pour la circonstance) comme le périmètre de recherche; et surtout de cliquer directement à l'endroit trouvé (c'est quand même le but initial).

    Est-ce possible ? et si oui comment?

  12. #52
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 932
    Par défaut
    Alors, je me réponds à moi-même, compte tenu, dans mon cas, de l'image qui n'est pas trouvée (elle est issue d'une "appli" qui tourne dans 1 page web - aucune zone dans la partie haute de cette appli n'est détectée d'ailleurs).
    Du coup, je dois prédéfinir les coordonnées de cette image pour y faire "à l'aveugle" 1 clic de temps en temps (avec hook de la souris pour les coordonnées)
    Pour l'autre image régulièrement détectée, pas de souci avec le code proposé, dont j'ai supprimé la notification "non trouvé", puisque si non trouvé, je recharge l'image du desktop.
    Pour capturer les images, je me suis tourné vers le compo Apprehend qui propose plusieurs types de capture (installé sans pb sous Berlin).
    2 TTimer pour orchestrer tout ça, qq TButton pour les (dés)activer, et roulezzzzz

    Merci à tous.

+ Répondre à la discussion
Cette discussion est résolue.
Page 3 sur 3 PremièrePremière 123

Discussions similaires

  1. Réponses: 11
    Dernier message: 07/06/2016, 15h30
  2. Comment modifier la position du curseur sur l'écran ?
    Par souffle56 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 26/09/2010, 00h43
  3. Vérification image sur l'écran.!
    Par kimore dans le forum Débuter
    Réponses: 4
    Dernier message: 02/04/2009, 09h44
  4. Afficher une image sur un écran 3D.
    Par pan99 dans le forum 3D
    Réponses: 1
    Dernier message: 16/04/2007, 13h48
  5. Réponses: 2
    Dernier message: 09/08/2006, 14h02

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