1. #1
    Membre habitué
    Profil pro
    Inscrit en
    juillet 2004
    Messages
    353
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juillet 2004
    Messages : 353
    Points : 194
    Points
    194

    Par défaut Afficher une fraction d'image dans TImage

    Bjr

    Je réalise une application Delphi 7 qui permet de faire du géocodage sur une image géographique. Il suffit de fournir les coordonnes (Lambert) de deux points de l'image pour que toute position de la souris puisse être convertie en Lambert quelque soit la taille donnée à la fenêtre de l'application sur l'écran.

    Les considérations géographiques ne sont pas la base de mon problème qui est le suivant : L'image-carte peut dépasser très largement la taille de l'écran. Il est possible d'utiliser l'option stretch du TImage mais cela dégrade la précision du pointage. Je voudrais agrandir l'image sans que le TImage change de taille et donc évidemment en affichant qu'une partie de l'image sur laquelle il sera possible de naviguer.

    Je ne vois pas comment faire cela avec un TImage ?

    Existe t il une solution ?

    Merci d'avance

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

    Informations forums :
    Inscription : juillet 2006
    Messages : 5 634
    Points : 7 752
    Points
    7 752

    Par défaut

    Citation Envoyé par frantzgac Voir le message
    Existe-t-il une solution ?
    Bien sûr ! Avec deux traits d'union, et un TBitmap de travail qui sera à la taille de l'image de ton fichier et sur lequel tu pourras te déplacer comme si tu te déplaçais sur le TImage, en recopiant la partie concernée du TBitmap dans le TImage pour voir où tu es et où tu vas.
    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
    Membre habitué
    Profil pro
    Inscrit en
    juillet 2004
    Messages
    353
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juillet 2004
    Messages : 353
    Points : 194
    Points
    194

    Par défaut

    Merci.
    J'envisageais quelque chose de ce genre mais espérais qu'il existât un procédé plus intégré.
    En revanche les "traits d'union" je ne vois ce que c'est en dehors de l'appellation académique du "tiret du 6" du clavier.
    Et recopier une partie d'image (comment se définit la partie) dans une autre je ne vois pas non plus quelle fonction fait cela.

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

    Informations forums :
    Inscription : juillet 2006
    Messages : 5 634
    Points : 7 752
    Points
    7 752

    Par défaut

    Yep !
    Citation Envoyé par frantzgac Voir le message
    J'envisageais quelque chose de ce genre mais espérais qu'il existât un procédé plus intégré.
    ...
    Et recopier une partie d'image (comment se définit la partie) dans une autre je ne vois pas non plus quelle fonction fait cela.
    J'ai passé la matinée à retourner le web sans rien trouver (je n'ai sans doute pas utilisé les bons mots-clé...)

    Recopier une partie d'image doit se faire en démarrant sur l'événement OnMouseDown et se terminer sur OnMouseUp, ça va déterminer un rectangle (et il va falloir jouer sur les coordonnées client versus screen, toute une histoire...), plus le fait que j'ai quand même découvert qu'en termes de "large images" il vaut mieux ne pas dépasser la taille maxi du bureau (limitations de la carte graphique). Au-delà, il faut découper la super-grande image en autant de bouts entrant dans cette dimension maxi.
    Va falloir tout faire à la mano, donc réfléchir très fort et très longtemps, et se poser des questions existentielles genre je démarre la sélection sur une partie de l'image qui est affichée sur la fiche, ok, mais je l'arrête où ?
    - en sortant de l'image ?
    - de la fiche (en aveugle, à moins de faire déplacer l'image) ?
    - du bureau (même remarque) ?

    Bon, il est possible d'attendre que d'autres lecteurs plus au fait de tout ça viennent poster leur grain de sel, mais là c'est week-end et après c'est vacances...

    Citation Envoyé par frantzgac Voir le message
    En revanche les "traits d'union" je ne vois ce que c'est en dehors de l'appellation académique du "tiret du 6" du clavier.
    C'est bien de cette touche dont je parlais.
    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
    Membre chevronné
    Homme Profil pro
    Développeur informatique
    Inscrit en
    novembre 2007
    Messages
    2 335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : novembre 2007
    Messages : 2 335
    Points : 2 138
    Points
    2 138

    Par défaut

    Je ne suis pas spécialiste du web mais il me semble qu'il y a une technique qui permet de "découper" une image en zone et ensuite d'afficher celle que l'on veut.
    Est-ce qu'il n'y aurait pas une solution mixte avec un TWebBrowser et cette technique ?

  6. #6
    Membre éprouvé Avatar de guillemouze
    Profil pro
    Inscrit en
    novembre 2004
    Messages
    780
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : novembre 2004
    Messages : 780
    Points : 1 240
    Points
    1 240

    Par défaut

    un petit exemple tout simple qui fonctionne : j'ai juste posé un TPaintBox dans une Form, avec 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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    type
      TForm1 = class(TForm)
        PaintBox1: TPaintBox;
        procedure PaintBox1Paint(Sender: TObject);
        procedure PaintBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
        procedure PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
        procedure FormCreate(Sender: TObject);
      private
        FBitmap: TBitmap;
        FOffset: TPoint;
        FLastPointSet: TPoint;// point a partir duquel calculer le mouvement de souris
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.PaintBox1Paint(Sender: TObject);
    begin
      //ici, eventuellement, une restriction du XY pour que l'image ne soit pas completement en dehors de l'ecran
      PaintBox1.Canvas.Draw(FOffset.X, FOffset.Y, FBitmap);
    end;
     
    procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    begin
      if ssLeft in Shift then
        FLastPointSet := Point(X, Y);
    end;
     
    procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    begin
      if ssLeft in Shift then
      begin
        FOffset.X := FOffset.X + X - FLastPointSet.X;
        FOffset.Y := FOffset.Y + Y - FLastPointSet.Y;
        FLastPointSet := Point(X, Y);
        PaintBox1.Invalidate;
      end;
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Self.DoubleBuffered := true;
      FBitmap := TBitmap.Create;
      FBitmap.LoadFromFile('C:\Users\Alex\Pictures\perceuse.png.alpha.bmp');
    end;

  7. #7
    Rédacteur/Modérateur
    Avatar de Andnotor
    Profil pro
    Inscrit en
    septembre 2008
    Messages
    4 343
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : septembre 2008
    Messages : 4 343
    Points : 8 773
    Points
    8 773

    Par défaut

    Je ne comprends pas trop le problème, un TImage dans un TScrollBox et le tour est joué !

  8. #8
    Expert éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    5 634
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 5 634
    Points : 7 752
    Points
    7 752

    Par défaut

    Bonjour,
    Citation Envoyé par guillemouze Voir le message
    un petit exemple tout simple qui fonctionne : j'ai juste posé un TPaintBox dans une Form, avec le code suivant :
    Citation Envoyé par Andnotor Voir le message
    Je ne comprends pas trop le problème, un TImage dans un TScrollBox et le tour est joué !
    Malgré cette contrainte ? :
    Citation Envoyé par frantzgac Voir le message
    L'image-carte peut dépasser très largement la taille de l'écran.
    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

  9. #9
    Membre expert
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2002
    Messages
    2 418
    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 : 2 418
    Points : 3 798
    Points
    3 798

    Par défaut

    salut

    bien sur les "scrollbar" sont fait pour ça
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  10. #10
    Membre averti Avatar de Cirec
    Profil pro
    Inscrit en
    octobre 2010
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2010
    Messages : 180
    Points : 380
    Points
    380

    Par défaut

    Citation Envoyé par anapurna Voir le message
    salut

    bien sur les "scrollbar" sont fait pour ça
    et même sans les "ScrollBars"
    1 TPanel
    1 TImage dedans avec AutoSize à True:
    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.OffsetImage(aPos: TPoint);
    begin
      Image1.Top := aPos.Y;
      Image1.Left := aPos.X;
    end;
     
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      Image1.Picture.LoadFromFile('The Lost Watch II NV Screenshot 01.bmp');// Choisir un Bitmap plus grand que le Panel
      OffsetImage(Point(Panel1.ClientWidth - Image1.Picture.Bitmap.Width, Panel1.ClientHeight - Image1.Picture.Bitmap.Height));
    end;
    ce code place l'image sur son coin inférieur droit en tenant compte de la taille de la zone d'affichage (le TPanel)

    Cordialement,
    @+

Discussions similaires

  1. Réponses: 11
    Dernier message: 10/10/2012, 15h17
  2. Afficher une liste d'images dans une cellule
    Par thierryler dans le forum Tables
    Réponses: 2
    Dernier message: 18/05/2011, 21h31
  3. Afficher une suite d'image dans un JScrollPane
    Par bilibou dans le forum Fenêtres/Dialogues
    Réponses: 2
    Dernier message: 31/05/2009, 09h24
  4. afficher une liste d'image dans la mème interface
    Par soforan dans le forum Interfaces Graphiques
    Réponses: 7
    Dernier message: 05/05/2008, 14h42
  5. Faire pivoter une image dans TImage
    Par Bourak dans le forum Langage
    Réponses: 4
    Dernier message: 17/03/2006, 08h51

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