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 :

Problème d'image parasite


Sujet :

Lazarus Pascal

  1. #1
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut Problème d'image parasite
    Bonjour à toutes et à tous,

    Dans l'application que je développe où je montre une carte avec des graduations, pour certaines cartes, se superpose une image parasite : un rectangle de dimension quelconque, de couleur celle du Brush.Color et encadré d'une ligne de couleur celle de Pen.Color :

    Nom : Img_parasite.jpg
Affichages : 193
Taille : 49,1 Ko

    J'ai un peu tout essayé, mais je n'arrive pas à voir d'où ça vient. Ce phénomène m'est déjà arrivé avec d'autres applications que j'ai développées.

    Il me semble que ce phénomène arrive quand la taille de l'image est petite.

    Dans l'application que je suis en train de développer, ce phénomène n'arrive jamais sur de grande image. Il arrive presque tout le temps avec de petites images.

    NOTA : ce phénomène n'est pas lié à l'affichage des graduations.

    Avez-vous déjà rencontré ce phénomène ? Une idée d'où ça vient ?

    Cordialement.

    Pierre.

  2. #2
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Je pense en avoir trouver la (une ?) source. Elle viendrait du fait que mon image ait la propriété "Align" à alClient d'entrée de jeu et que mon image ait pour coordonnées Left = 0 et Top = 0.

    Après plusieurs essais, je me suis aperçu que si je mettais la propriété "Align" de l'image à alNone et que je plaçais cette image loin du coin haut gauche (au moins la taille du rectangle parasite ??), alors ce rectangle parasite n’apparaissait plus sur les petites images.

    Si, après visualisation de cette image ramassée en bas à droite de la ScrollBox, je rétablissais la propriété "Align" de mon image à alClient, alors toute la représentation reprenait sa place, le scrolling fonctionnait et mes petites images n'étaient plus polluées par ce rectangle parasite.

    J'ai résolu l'automaticité de ça en utilisant un Timer. La procédure est la suivante :

    • Mise à alNone de la propriété Align de mon TImage
    • Chargement de mon image via un TJPEGImage;
    • Copie de cette image dans le TImage à afficher
    • Lancement du Timer (durée mise à 100 mS : on n'a pas le temps de s'apercevoir de l'astuce)
    • ShowModal de la fenêtre contenant le TImage (la fenêtre est créée au lancement de l'application)
    • ...
    • sur le OnTimer, mise à alClient de la propriété Align de mon TImage --> tout redevient normal.


    Voilà ! C'est du grand n'importe quoi, mais ça marche.

    Si vous avez une solution un peu plus orthodoxe, je suis preneur.

    Cordialement.

    Pierre.

  3. #3
    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, dur de te répondre comme ça sans code. Un truc qui me chiffone (dans ton autre message) pourquoi dessiner tes graduations à la fois sur le timage et sur le scrollbox.

    Si tu le fait sur le scrollbox tu devras calculer suivant les positions du scroll les intervales de tes graduations. Si c'est dans le bitmap du TImage, pas besoin de dessiner tes graduations dans la scrollbox.

    Un truc bizarre, c'est que ton rectangle ne suit pas les lignes de tes graduations. A mon avis, ici il y a un appel pour redessiner le client de ta scrollbox avant que tu y mettes le TImage.
    Effaces tu le canvas de la scrollbox avant de dessiner dessus ?.

    Ensuite mettre ton timage sur alclient n'a pas de sens car tu veux scroller, tu ne veux pas que ton timage fasse la taille de ta scrollbox (sauf si set la taille du client de la scrollbox, mais je ne me souviens plus des propriétés).
    Donc, pour ma part, je laisserai ton client timage sur alNone et le positionnerai avec left/top à 0. C'est tout.
    • "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

  4. #4
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Salut, dur de te répondre comme ça sans code. Un truc qui me chiffone (dans ton autre message) pourquoi dessiner tes graduations à la fois sur le timage et sur le scrollbox.

    Si tu le fait sur le scrollbox tu devras calculer suivant les positions du scroll les intervales de tes graduations. Si c'est dans le bitmap du TImage, pas besoin de dessiner tes graduations dans la scrollbox. ...
    Je ne dessine pas les graduations à la fois dans le scrollBox et dans le TImage.

    Ma première solution était de les copier dans le TImage et la seconde était de créer des imagettes de ces graduations et de les placer dans la ScrollBox.

    Pour autant, le problème des graduations est totalement indépendant du problème du rectangle parasite.

    Citation Envoyé par BeanzMaster Voir le message
    ... Un truc bizarre, c'est que ton rectangle ne suit pas les lignes de tes graduations. A mon avis, ici il y a un appel pour redessiner le client de ta scrollbox avant que tu y mettes le TImage.
    Effaces tu le canvas de la scrollbox avant de dessiner dessus ? ...
    J'ai placé un "ScrollBox.Canvas.Clear" un peu partout dans le processus : aucune action. A mon sens, c'est normal car je n'y dessine rien.
    Le Rectangle parasite ayant son fond et son contour avec les couleurs du TImage, je pense qu'il appartient au TImage.

    Citation Envoyé par BeanzMaster Voir le message
    ... Ensuite mettre ton timage sur alclient n'a pas de sens car tu veux scroller, tu ne veux pas que ton timage fasse la taille de ta scrollbox (sauf si set la taille du client de la scrollbox, mais je ne me souviens plus des propriétés).
    Donc, pour ma part, je laisserai ton client timage sur alNone et le positionnerai avec left/top à 0. C'est tout.
    Le Align à alClient est nécessaire :

    • à la ScrollBox afin de continuer à voir les barres de scrolling si je diminue la dimension de la Form ;
    • au Timage afin de voir toute l'image si j'agrandis la Form.

    Voici le code qui me permet de charger les dalles et de les dessiner dans le TImage. Je n'ai pas ajouté la procédure de traçage des graduations car elle n'intervient pas dans le problème de rectangle parasite.

    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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    procedure TCreeCarte.InitCarte(Titre: String; R, C: Integer);
    {Problème : si ImgCarte.Align = alClient d'entrée de jeu, un rectangle parasite
     apparaît sur les petites images. Pour y pallier, on met ImgCarte.Align à alNone
     et on le rétablit à alClient seulement après le ShowModal à l'aide d'un Timer.
     Il faut aussi que le coin haut et gauche du TImage soit le plus loin possible
     du coin haut et gauche de la ScrollBox. ??}
    begin
      ImgCarte.Align:= alNone;
      Caption:= Titre;
      ImgGradOk:= False;
      ChargeDalles(LstCartes[R], ValZoom[C]);
      Timer.Enabled:= True;
      ShowModal;
    end;
     
    procedure TCreeCarte.ChargeDalles(Carte: TLstCartes; Zoom: String);
    var
      SRLon, SRLat: TSearchRec;
      i, OSMLa, OSMLo, Z: Integer;
      NomFch: String;
    begin
    {$I-}
      NomFch:= RepCartes+SepRep+Carte.Nom+Zoom;
      ChDir(RepCartes+SepRep+Carte.Nom+Zoom);
      SetLength(NomDalle, 0);
      OSMLaMin:= 100000;
      OSMLaMax:= -100000;
      OSMLoMin:= 100000;
      OSMLoMax:= -100000;
      if  IOresult = 0 then
      begin
        if FindFirst ('*', faDirectory, SRLon) = 0 then
        repeat // Recherche des longitudes
          if (SRLon.Name <> '.') and (SRLon.Name <> '..') then
            if (SRLon.Attr and faDirectory) = faDirectory then
            begin
              OSMLo:= StrToInt(SRLon.Name);
              if OSMLo < OSMLoMin then
                OSMLoMin:= OSMLo;
              if OSMLo > OSMLoMax then
                OSMLoMax:= OSMLo;
              ChDir(RepCartes+SepRep+Carte.Nom+Zoom+SepRep+SRLon.Name);
              if FindFirst ('*.jpg', faArchive, SRLat) = 0 then
              repeat // Recherche des latitudes dans les fichiers des longitudes
                if ((SRLat.Attr and faArchive) = faArchive) then
                begin
                  OSMLa:= StrToInt(ChangeFileExt(SRLat.Name, ''));
                  if OSMLa < OSMLaMin then
                    OSMLaMin:= OSMLa;
                  if OSMLa > OSMLaMax then
                    OSMLaMax:= OSMLa;
                  SetLength(NomDalle, Length(NomDalle) + 1);
                  NomDalle[High(NomDalle)].OSMLon:= OSMLo;
                  NomDalle[High(NomDalle)].OSMLat:= OSMLa;
                end;
              until FindNext(SRLat) <> 0;
              FindClose(SRLat);
            end;
        until FindNext(SRLon) <> 0;
        FindClose(SRLon);
      end;
    {$I+}
      Z:= StrToInt(Zoom);
      ZoomAff:= Z;
      with Carte do begin
        LatMax:= LatOSM(OSMLaMin, Z);
        LatMin:= LatOSM(OSMLaMax+1, Z);
        LonMax:= LonOSM(OSMLoMax+1, Z);
        LonMin:= LonOSM(OSMLoMin, Z);
        AffBase.Infos.Panels[3].Text:= Format('LatMin = %.4f°  LatMax = %.4f°  LonMin = %.4f°  LonMax = %.4f°', [LatMin, LatMax, LonMin, LonMax]);
      end;
      CarteAff:= Carte;
      i:= Length(NomDalle);
      NbLa:= Abs(OSMLaMax-OSMLaMin)+1;
      NbLo:= Abs(OSMLoMax-OSMLoMin)+1;
      FeLon:= DimRed/(LonOSM(OSMLoMax+1, Z)-LonOSM(OSMLoMax, Z));
      FeLat:= (DimRed/(LatOSM(OSMLaMax, Z)-LatOSM(OSMLaMax+1, Z))
            + DimRed/(LatOSM(OSMLaMin, Z)-LatOSM(OSMLaMin+1, Z)))/2;
      AfficheDalles(Carte, Zoom);
    end;
     
    procedure TCreeCarte.AfficheDalles(Carte: TLstCartes; Zoom: String);
    var
      i: Integer;
      Img: TJPEGImage;
      RctSrc, RctDst: Trect;
      k: Double;
      NomFch: String;
    begin
      ImgCarte.Picture.Clear; // Nécessaire sinon, la carte ne s'affiche qu'une fois sur deux ?
      with ImgCarte.Picture.Bitmap do
      begin
        Brush.Color:= clCream;
        Canvas.Pen.Style:= psSolid;
        Canvas.Pen.Mode:= pmCopy;
        Canvas.Pen.Color:= clBlue;
        Font.Color:= clBlue;
        Width:= NbLo*DimRed;
        Height:= NbLa*DimRed;
        Canvas.FillRect(Rect(0, 0, Width, Height));
      end;
      Caption:= Caption+'   Nombre de dalles en X : '+ IntToStr(NbLo)+' ; en Y : '+IntToStr(NbLa);
      RctSrc:= Rect(0, 0, DimRed, DimRed);
      k:= TblCartes.ProgressCharg.Max/Length(NomDalle);
      Img:= TJPEGImage.Create;
      for i:= 0 to High(NomDalle) do
        with NomDalle[i] do
        begin
          NomFch:= RepCartes+SepRep+Carte.Nom+Zoom+SepRep+IntToStr(OSMLon)+SepRep+IntToStr(OSMLat)+'.jpg';
          Img.LoadFromFile(NomFch);
          RctDst:= Rect(DimRed*(OSMLon-OSMLoMin), DimRed*(OSMLat-OSMLaMin), DimRed*(OSMLon-OSMLoMin+1), DimRed*(OSMLat-OSMLaMin+1));
          ImgCarte.Picture.Bitmap.Canvas.CopyRect(RctDst, Img.Canvas, RctSrc);
        end;
      FreeAndNil(Img);
     
    //  Graduation(Carte, StrToInt(Zoom));
    end;
    Cordialement.

    Pierre.

  5. #5
    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 Pierre si cela peut aider voici une demo que j'avais fait avec BZScene

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

  6. #6
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Salut Pierre si cela peut aider voici une demo que j'avais fait avec BZScene
    Merci pour ce lien. Peux-tu me dire comment faire pour tout télécharger d'un seul coup.

    Cordialement.

    Pierre.

  7. #7
    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
    Citation Envoyé par ChPr Voir le message
    Merci pour ce lien. Peux-tu me dire comment faire pour tout télécharger d'un seul coup.
    Qu'entend tu par la ?

    Si tu veux dire si je charge toutes les tiles d'un coup ?

    Non les tiles sont chargées et affichées dynamiquement en fonction de la position. Pour rechercher les fichiers et les dossiers j'utilises les fonctions SearchFolder et SearchFiles dispo dans mon composant TBZFileFinder
    Ensuite le chargement et l'affichage des tiles est gérer dans de le composant TBZCustomTileMap du fichier BZTileMapEngine
    • "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. #8
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Qu'entend tu par la ?
    Ce sont tous les fichiers de ton exemple que je veux charger sur github.

    Cordialement.

    Pierre.

  9. #9
    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
    Citation Envoyé par ChPr Voir le message
    Ce sont tous les fichiers de ton exemple que je veux charger sur github.

    Cordialement.

    Pierre.
    Il faut que tu télécharges tous les exemples https://github.com/jdelauney/BZScene-Samples Bouton code-> Download as zip. Puis après la demo c'est dans le dossier Graphics/DynamicTileMap. Sur la page tu a le liens vers BZScene si jamais
    • "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

  10. #10
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Il faut que tu télécharges tous les exemples https://github.com/jdelauney/BZScene-Samples Bouton code-> Download as zip. Puis après la demo c'est dans le dossier Graphics/DynamicTileMap. Sur la page tu a le liens vers BZScene si jamais
    Super, merci.

    Cordialement.

    Pierre.

Discussions similaires

  1. Réponses: 3
    Dernier message: 05/07/2005, 18h07
  2. problème affichage image
    Par thealpacino dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 30/05/2005, 13h56
  3. [javascript] problème insertion image
    Par Pwill dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 18/05/2005, 16h12
  4. problème dessiner image dans fenêtre
    Par raoulman dans le forum MFC
    Réponses: 5
    Dernier message: 13/12/2004, 15h44
  5. Problème d'image avec DirectX9 et c# VS.net...
    Par lilly_lilly dans le forum DirectX
    Réponses: 1
    Dernier message: 02/03/2004, 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