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

Langage Delphi Discussion :

Faire un zoom sur un TImage


Sujet :

Langage Delphi

  1. #1
    Membre chevronné
    Avatar de Archimède
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2005
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 644
    Points : 1 975
    Points
    1 975
    Par défaut Faire un zoom sur un TImage
    voilà mon projet est de réaliser un zoom sur une zone donnée d'une
    image chargée dans un bitmap ; cette zone se déplace avec la position de la souris. C'est donc équivalent à une loupe que l'on déplace sur l'image.

    pour cela, j'ai donc chargé un fichier bmp dans un bitmap et je fais un draw dans une paintbox sur la fiche. J'ai créé un deuxième bitmap et en
    utilisant copyrect, je prends une partie de l'image dans le rectsource défini par rapport aux coordonnées de la souris pour l'associer à un événement onmousemove et le caneva de ce deuxième bitmap contient la partie de l'image agrandie car rectdestination à une dimension fixe et supérieure à rectsource.
    c'est ici que ça devient difficile puisque l'idée première était d'intégrer dans le caneva du premier bitmap le second et de peindre le tout dans la paintbox. Evidemment, en bougeant la souris, la structure de l'image se décompose puisque les modifs successives du canvas sont cumulées à chaque événement onmousemove.
    dans cette direction et en gardant une image chargée dans un bitmap, puis-je arriver à faire zoom mobile à la souris.
    j'ai pensé à copymode pour combiner de différentes manières les bitmaps.. pas de résultats.

  2. #2
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    Suggestion : Pourquoi ne pas mettre le zoom dans une form sans bordure (borderstyle=bsnone) et lors du mousemove de la souris dans la form de zoom tu peux changer son contenu.

    Ci-dessous un embryon de code qui perme de déplacer une forme lorsque la souris est dessus.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    var dx,dy:integer ;
    begin
    if px=-1 // instruction px:=-1 à mettre dans l'init
       then begin px:=x ; py:=y ; end 
       else begin dx:=(X-px) ; dy:=(y-py) ;
                 left:=left+dx ; top:=top+dy ; px:=x-dx ;  py:=y-dy ;  end ;
     
    end;
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  3. #3
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Rebonjour,

    En fait, on n'a pas vraiment besoin de form.

    On peut aussi bien le faire avec un panel et activer les actions de déplacement/tracé sur mousemove par l'événement mousedown sur l'image et désactiver les actions au mouseup.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  4. #4
    Membre confirmé

    Inscrit en
    Novembre 2002
    Messages
    744
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 744
    Points : 500
    Points
    500
    Par défaut
    salut ,

    une loupe existe dans les sources delphi sur le site et developpé par NONO40 , peut etre est ce que tu cherches ou du moins te mettra sur la voix !

    http://delphi.developpez.com/sources...a_applications

    bye
    Bye et bon code...

    Ce n'est pas tant l'aide de nos amis qui nous aide , mais notre confiance dans cette aide .

  5. #5
    Membre chevronné
    Avatar de Archimède
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2005
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 644
    Points : 1 975
    Points
    1 975
    Par défaut
    je te remercie, je le connais. faire un zoom séparé ne me pose aucun soucis mais ce que je voulais faire c'était sur l'image avec un maximum de fluidité. tout en vituel dans des bitmaps et basculer dans le réel en faisant un draw dans la paintbox à la fin.

  6. #6
    Membre chevronné
    Avatar de Archimède
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2005
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 644
    Points : 1 975
    Points
    1 975
    Par défaut
    je vais faire un essai...
    j'avais aussi dans l'idée de créer un troisième bitmap qui garderait en mémoire dans le canvas l'image initial du premier ainsi à chaque déplacement de souris, le bitmap1 (combinaison de l'image et du zoom) retrouverait en début de code uniquement l'image dans son canvas. Et le draw dans la paintbox montrerait bien l'mage et le zoom en déplacement sans cumuler toutes les modifs successives.
    comme ça, je n'ai pas besoin d'objet réel supplémentaire à déplacer sur la forme et je gagnerai en fluidité puisque l'affichage se fait sur le draw final.
    merci encore.

  7. #7
    Membre chevronné
    Avatar de Archimède
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2005
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 644
    Points : 1 975
    Points
    1 975
    Par défaut a&ér²&a
    c'est pas très propre mais ça marche nickel :
    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
     
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls;
     
    type
      TForm1 = class(TForm)
        PaintBox1: TPaintBox;
        procedure FormCreate(Sender: TObject);
        procedure FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
          MousePos: TPoint; var Handled: Boolean);
        procedure FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
          MousePos: TPoint; var Handled: Boolean);
        procedure PaintBox1Paint(Sender: TObject);
        procedure PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
          Y: Integer);
        procedure FormDestroy(Sender: TObject);
      private
        { Déclarations privées }
        taille:integer;
        zoombit:Tbitmap;
        bitm:array[1..2] of Tbitmap;
        rectsource,rectdestination:Trect;
        procedure zoom(x,y,taille:integer);
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.FormCreate(Sender: TObject);
    var i:integer;
     
    begin
    position:=poscreencenter;
    taille:=20;
     
    for i:=1 to 2 do begin
    bitm[i]:=Tbitmap.Create;
    with bitm[i] do begin
    width:=paintbox1.clientWidth;
    height:=paintbox1.clientHeight;
    loadfromfile('chemin ');
    end;
     
    zoombit:=Tbitmap.Create;
    with zoombit do begin
    width:=150;
    height:=150;
    end;
     
    end;
     
    procedure TForm1.zoom(x,y,taille:integer);
    begin
    bitm[1].Canvas.CopyRect(paintbox1.ClientRect,bitm[2].canvas,paintbox1.clientrect);
    rectsource:=rect(x-50+taille,y-50+taille,x+50-taille,y+50-taille);
    rectdestination:=rect(0,0,150,150);
    zoombit.Canvas.CopyRect(rectdestination,bitm[1].canvas,rectsource);
    bitm[1].Canvas.Draw(x-zoombit.Width div 2,y-zoombit.height div 2,zoombit);
    end;
     
    procedure TForm1.FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
      MousePos: TPoint; var Handled: Boolean);
    begin
    dec(taille);
    end;
     
    procedure TForm1.FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
      MousePos: TPoint; var Handled: Boolean);
    begin
    inc(taille);
    end;
     
     
     
    procedure TForm1.PaintBox1Paint(Sender: TObject);
    begin
    paintbox1.canvas.Draw(0,0,bitm[1]);
    end;
     
    procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
    zoom(x,y,taille);
    paintbox1paint(nil);
    end;
     
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
    bitm[1].Free;
    bitm[2].Free;
    zoombit.Free;
    end;
     
    end.
    si vous avez des idées d'amélioration...

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

Discussions similaires

  1. Faire un zoom sur une zone précise d'une image
    Par Marc22 dans le forum Flash
    Réponses: 0
    Dernier message: 23/11/2010, 23h35
  2. Comment faire un zoom sur image ?
    Par cmarsc dans le forum Tcl/Tk
    Réponses: 6
    Dernier message: 14/02/2009, 08h54
  3. Comment faire un zoom sur un bloc html ?
    Par vodnok dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 12/07/2007, 14h51
  4. Faire un zoom sur courbe Wave avec déplacement
    Par FredericB dans le forum C++Builder
    Réponses: 3
    Dernier message: 23/04/2006, 14h22
  5. Faire un zoom sur un picture
    Par dibeloni dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 14/12/2005, 08h14

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