begin process at 2012 02 11 12:46:25
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Graphique

 > CONTROLE IMAGE ZOOM/DÉZOOM

CONTROLE IMAGE ZOOM/DÉZOOM


 Information sur la source

Note :
9 / 10 - par 1 personne
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Graphique Source .NET ( DotNet ) Classé sous :Image, Zoom, Souris, GDI, Control Niveau :Initié Date de création :17/02/2009 Date de mise à jour :09/06/2009 14:35:37 Vu :6 126

Auteur : lesdis

Ecrire un message privé
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (13)
Ajouter un commentaire et/ou une note


 Description

Cliquez pour voir la capture en taille normale
Un petit control permettant de zoomer / dézoomer ainsi que de déplacer l'image, le tout à la souris.

Pas de zip, il suffit juste de copier / coller le code de la classe pour l'intégrer dans une source

Source

  • Imports System.Drawing.Drawing2D
  • Public Class ImageBox
  • Inherits Control
  • Private _image As Image
  • Private _zoom As Single = 1
  • Private _position As PointF = New PointF(0, 0)
  • Private _width, _height, _rapportX, _rapportY As Single
  • Private _DestRect, _SrcRect As Rectangle
  • Private _LastPoint As Point
  • Public Sub New()
  • 'pour eviter le scintillement
  • Me.DoubleBuffered = True
  • End Sub
  • Public Sub New(ByVal pic As Image)
  • 'pour eviter le scintillement
  • Me.DoubleBuffered = True
  • Me.Image = pic
  • End Sub
  • Public Property Image() As Image
  • Get
  • Return _image
  • End Get
  • Set(ByVal value As Image)
  • _image = value
  • If _image IsNot Nothing AndAlso Me.Width <> 0 AndAlso Me.Height <> 0 Then
  • _rapportX = (_image.Width / Me.Width)
  • _rapportY = (_image.Height / Me.Height)
  • End If
  • draw_image(New PointF(0, 0))
  • End Set
  • End Property
  • Private Sub draw_image(ByVal position As PointF, Optional ByVal delta As Single = 0)
  • If _image IsNot Nothing Then
  • _zoom -= delta / 100
  • 'Limite du zoom
  • If _zoom > 1 Then
  • _zoom += delta / 100
  • ElseIf _zoom < 0 Then
  • _zoom += delta / 100
  • Else
  • _width = _zoom * _image.Width
  • _height = _zoom * _image.Height
  • _position.X += (position.X - (position.X * (1 - (delta / 100)))) * _rapportX
  • _position.Y += (position.Y - (position.Y * (1 - (delta / 100)))) * _rapportY
  • '************ Vérification pour que l'image ne sorte pas du cadre **************
  • If _position.X < 0 Then
  • _position.X = 0
  • End If
  • If _position.Y < 0 Then
  • _position.Y = 0
  • End If
  • If _position.Y + ((Me.Height * _rapportY)) * _zoom > _image.Height Then
  • _position.Y -= (_position.Y + ((Me.Height * _rapportY)) * _zoom) - _image.Height
  • End If
  • If _position.X + ((Me.Width * _rapportX)) * _zoom > _image.Width Then
  • _position.X -= (_position.X + ((Me.Width * _rapportX)) * _zoom) - _image.Width
  • End If
  • '*********************************************************************************
  • _SrcRect = New Rectangle(_position.X, _position.Y, _width, _height)
  • End If
  • End If
  • Me.Invalidate()
  • End Sub
  • Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
  • MyBase.OnPaint(e)
  • If _image IsNot Nothing Then
  • e.Graphics.DrawImage(_image, _DestRect, _SrcRect, GraphicsUnit.Pixel)
  • Else
  • e.Graphics.FillRectangle(Brushes.White, _DestRect)
  • e.Graphics.DrawRectangle(Pens.Black, 0, 0, Me.Width - 1, Me.Height - 1)
  • End If
  • End Sub
  • Protected Overrides Sub OnMouseWheel(ByVal e As System.Windows.Forms.MouseEventArgs)
  • MyBase.OnMouseWheel(e)
  • draw_image(e.Location, e.Delta / 30)
  • End Sub
  • Protected Overrides Sub OnMouseEnter(ByVal e As System.EventArgs)
  • MyBase.OnMouseEnter(e)
  • Me.Focus() 'l'évènement mousewheel ne fonctionne que lorsque le controle possède le focus
  • End Sub
  • Protected Overrides Sub OnMouseLeave(ByVal e As System.EventArgs)
  • MyBase.OnMouseLeave(e)
  • Me.Parent.Focus() 'on redonne le focus au controleur parent pour stopper les évènement mousewheel
  • End Sub
  • Protected Overrides Sub OnClientSizeChanged(ByVal e As System.EventArgs)
  • MyBase.OnClientSizeChanged(e)
  • _DestRect = New Rectangle(0, 0, Me.Width, Me.Height)
  • If _image IsNot Nothing Then
  • _rapportX = (_image.Width / Me.Width)
  • _rapportY = (_image.Height / Me.Height)
  • End If
  • End Sub
  • Protected Overrides Sub OnMouseDown(ByVal e As System.Windows.Forms.MouseEventArgs)
  • MyBase.OnMouseDown(e)
  • _LastPoint = e.Location
  • End Sub
  • Protected Overrides Sub OnMouseMove(ByVal e As System.Windows.Forms.MouseEventArgs)
  • MyBase.OnMouseMove(e)
  • If e.Button = Windows.Forms.MouseButtons.Left Then
  • _position.X += ((_LastPoint.X - e.X) * _zoom) * _rapportX
  • _position.Y += ((_LastPoint.Y - e.Y) * _zoom) * _rapportY
  • draw_image(New PointF(0, 0))
  • _LastPoint = e.Location
  • End If
  • End Sub
  • Protected Overrides Sub Dispose(ByVal disposing As Boolean)
  • MyBase.Dispose(disposing)
  • If _image IsNot Nothing Then
  • _image.Dispose()
  • End If
  • End Sub
  • End Class
Imports System.Drawing.Drawing2D

Public Class ImageBox
    Inherits Control


    Private _image As Image
    Private _zoom As Single = 1
    Private _position As PointF = New PointF(0, 0)
    Private _width, _height, _rapportX, _rapportY As Single
    Private _DestRect, _SrcRect As Rectangle

    Private _LastPoint As Point

    Public Sub New()
        'pour eviter le scintillement
        Me.DoubleBuffered = True
    End Sub

    Public Sub New(ByVal pic As Image)
        'pour eviter le scintillement
        Me.DoubleBuffered = True

        Me.Image = pic
    End Sub

    Public Property Image() As Image
        Get
            Return _image
        End Get
        Set(ByVal value As Image)
            _image = value

            If _image IsNot Nothing AndAlso Me.Width <> 0 AndAlso Me.Height <> 0 Then
                _rapportX = (_image.Width / Me.Width)
                _rapportY = (_image.Height / Me.Height)
            End If

            draw_image(New PointF(0, 0))
        End Set
    End Property

    Private Sub draw_image(ByVal position As PointF, Optional ByVal delta As Single = 0)
        If _image IsNot Nothing Then
            _zoom -= delta / 100

            'Limite du zoom
            If _zoom > 1 Then
                _zoom += delta / 100
            ElseIf _zoom < 0 Then
                _zoom += delta / 100
            Else

                _width = _zoom * _image.Width
                _height = _zoom * _image.Height



                _position.X += (position.X - (position.X * (1 - (delta / 100)))) * _rapportX
                _position.Y += (position.Y - (position.Y * (1 - (delta / 100)))) * _rapportY

                '************ Vérification pour que l'image ne sorte pas du cadre **************
                If _position.X < 0 Then
                    _position.X = 0
                End If
                If _position.Y < 0 Then
                    _position.Y = 0
                End If

                If _position.Y + ((Me.Height * _rapportY)) * _zoom > _image.Height Then
                    _position.Y -= (_position.Y + ((Me.Height * _rapportY)) * _zoom) - _image.Height
                End If
                If _position.X + ((Me.Width * _rapportX)) * _zoom > _image.Width Then
                    _position.X -= (_position.X + ((Me.Width * _rapportX)) * _zoom) - _image.Width
                End If
                '*********************************************************************************

                _SrcRect = New Rectangle(_position.X, _position.Y, _width, _height)
            End If

        End If
        Me.Invalidate()
    End Sub

    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
        MyBase.OnPaint(e)
        If _image IsNot Nothing Then
            e.Graphics.DrawImage(_image, _DestRect, _SrcRect, GraphicsUnit.Pixel)
        Else
            e.Graphics.FillRectangle(Brushes.White, _DestRect)
            e.Graphics.DrawRectangle(Pens.Black, 0, 0, Me.Width - 1, Me.Height - 1)
        End If
    End Sub

    Protected Overrides Sub OnMouseWheel(ByVal e As System.Windows.Forms.MouseEventArgs)
        MyBase.OnMouseWheel(e)
        draw_image(e.Location, e.Delta / 30)
    End Sub


    Protected Overrides Sub OnMouseEnter(ByVal e As System.EventArgs)
        MyBase.OnMouseEnter(e)
        Me.Focus() 'l'évènement mousewheel ne fonctionne que lorsque le controle possède le focus
    End Sub

    Protected Overrides Sub OnMouseLeave(ByVal e As System.EventArgs)
        MyBase.OnMouseLeave(e)
        Me.Parent.Focus() 'on redonne le focus au controleur parent pour stopper les évènement mousewheel
    End Sub

    Protected Overrides Sub OnClientSizeChanged(ByVal e As System.EventArgs)
        MyBase.OnClientSizeChanged(e)
        _DestRect = New Rectangle(0, 0, Me.Width, Me.Height)
        If _image IsNot Nothing Then
            _rapportX = (_image.Width / Me.Width)
            _rapportY = (_image.Height / Me.Height)
        End If
    End Sub


    Protected Overrides Sub OnMouseDown(ByVal e As System.Windows.Forms.MouseEventArgs)
        MyBase.OnMouseDown(e)
        _LastPoint = e.Location
    End Sub

    Protected Overrides Sub OnMouseMove(ByVal e As System.Windows.Forms.MouseEventArgs)
        MyBase.OnMouseMove(e)
        If e.Button = Windows.Forms.MouseButtons.Left Then
            _position.X += ((_LastPoint.X - e.X) * _zoom) * _rapportX
            _position.Y += ((_LastPoint.Y - e.Y) * _zoom) * _rapportY

            draw_image(New PointF(0, 0))

            _LastPoint = e.Location
        End If
    End Sub

    Protected Overrides Sub Dispose(ByVal disposing As Boolean)
        MyBase.Dispose(disposing)
        If _image IsNot Nothing Then
            _image.Dispose()
        End If
    End Sub
End Class

 Conclusion

Je n'ai pas mis beaucoup de commentaire par flemme, j'en rajouterais si cela vous semble nécessaire.

Et comme d'habitude, si vous avez des propositions d'améliorations, je suis preneur :)


 Historique

17 février 2009 15:41:48 :
- Modification d'une erreur mineure
18 février 2009 12:05:51 :
Résolution des erreurs lorsqu'il n'y a pas d'image
09 juin 2009 10:33:39 :
Ajout du calcul des variables _rapport lorsqu'une image est modifiée.
09 juin 2009 14:35:37 :
Petite modif

 Sources du même auteur

Source avec Zip Source avec une capture Source .NET (Dotnet) DIAGRAMME CAMEMBERT
Source avec Zip Source avec une capture Source .NET (Dotnet) DIAGRAMME BATON
Source avec Zip Source avec une capture Source .NET (Dotnet) UTILISATION DU PORT COM VS2005

 Sources de la même categorie

Source avec une capture GRAPH PHP COURBE DE CHARGE par s.defaye
Source avec Zip Source avec une capture BOULE DE CRISTAL par BLUEBIBUBBLE
VB6 - DÉPLACEMENT D'UN CONTRÔLE SUR UN SEGMENT DE DROITE DÉL... par ucfoutu
Source avec Zip Source .NET (Dotnet) APPLICATION DE DESSIN par fsafsafsaf
Source avec Zip Source avec une capture Source .NET (Dotnet) MERGEIMAGES par Le Pivert

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture Source .NET (Dotnet) MM CHECKBOX .NET V.2009 par Mayzz
Source avec Zip Source avec une capture BOITE COULEURS par Le Pivert
Source avec Zip Source avec une capture Source .NET (Dotnet) GRAPHIQUE UTILISANT LE DOUBLE BUFFERING (ENLÉVE L'EFFET DE ... par guillaume1136
Source avec Zip Source .NET (Dotnet) VB2005 ZOOM-DÉPLACEMENT IMAGE par filou26
Source avec Zip Source avec une capture Source .NET (Dotnet) USERCONTROL PERMETTANT D'AFFICHER UNE CARTE (OU N'IMPORTE QU... par preventionhs

Commentaires et avis

Commentaire de gillardg le 18/02/2009 11:35:25

exeption non gérée lors de la création du contrôle

si pas d'image =>impossible de faire un resize :-)

  Protected Overrides Sub OnClientSizeChanged(ByVal e As System.EventArgs)
        MyBase.OnClientSizeChanged(e)
        _DestRect = New Rectangle(0, 0, Me.Width, Me.Height)
        _rapportX = (_image.Width / Me.Width)
        _rapportY = (_image.Height / Me.Height)
    End Sub

Commentaire de gillardg le 18/02/2009 12:03:18

je te propose cette correction
ajouter un bitmap image1 (100 X 100) en ressource
il y a évidement moyen de créer ce bitmap en code , à toi de voir
+ le code :)
    Public Sub New()
        If _image Is Nothing Then
            _image = My.Resources.Image1
        End If
        'pour eviter le scintillement
        Me.DoubleBuffered = True
    End Sub

Commentaire de lesdis le 18/02/2009 12:10:18

J'ai corriger avant ta proposition en excluant les calculs liés a l'image tant que celle ci est inexistante.

Je ne saurais dire si cela est plus interessant que de créer une image par defaut dès le début

Commentaire de Schwerdtle le 18/02/2009 14:25:40

Et pourquoi pas un zip maintenant, avec une image ?
Merci et bravo.

Commentaire de gillardg le 18/02/2009 14:39:34

lesdis , je n'en sais pas plus que toi :)

mais le controle PictureBox contient une image initiale

Commentaire de Icewall le 26/02/2009 12:05:52 9/10

J'ai apporté quelques modifications à ton code source pour l'adapter à mon PictureBox :

Public Class ImageBox
    Inherits PictureBox

    Overloads Property Image() As Image

C'est super marrant ton code. J'ai choisi une image avec un type qui regarde un paquet de dollar avec des yeux énormes. Et quand je zoom, on voit la tête qu'il fait en gros plan.

Cependant je me demandais s'il était possible de zoomer sur un autre endroit de l'image. Il semble que par défaut, il zoom sur la partie supérieure gauche.

Commentaire de lesdis le 26/02/2009 12:38:54

C'est bizarre, chez moi le zoom se fait suivant l'endroit ou se situe la souris.

Peut-être est ce à cause de ta modification... Je ne pourrais te dire!

Commentaire de blueangel82 le 09/06/2009 09:39:56

en fait quand on "pose" le composant et que l'on affecte une image tout marche bien , mais quand on charge l'image via du code, on ne peut plus déplacer l'image et le zoom se base sur le coin sup gauche.
Qqun aurait une idée ?

Commentaire de lesdis le 09/06/2009 10:34:21

Normalement cela devrait fonctionner normalement BlueAngel82 :)

Commentaire de jbjbjb le 24/03/2010 10:30:04

Bonjour,
Comment utiliser la class? Quelle méthode faut-il appeler?
Merci

Commentaire de lesdis le 24/03/2010 11:06:21

Bonjour,

Il te suffit de créer une nouvelle classe vierge, d'y copier/coller le code.
Pour l'utilisation, il faut renseigner la propriété Image du control, pour cela 2 méthodes :

- En mode designer, clique sur la propriété image et choisir une image dans l'explorateur
- En mode code, il faut créer un objet image et renseigner la propriété image du control

Commentaire de jbjbjb le 24/03/2010 12:36:21

Merci de ta rapidité!

Commentaire de titidecormo le 20/05/2011 20:55:40

Je n'arrive pas à l'associé a une pictureBox ...

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

souris/image.gif animé [ par erick33 ] Je cherche un codes pour qu'un gif a..suive la souris. crée une image de survol [ par taglli ] bonjourj'aimerais savoir comment faire pour faire une image de survol. je m'explique, quand la souris passe sur un image cette image change juse quand afficher du texte au passage de souris sur image [ par ben ] comment faire pour qu'au passage d'une souris sur une image, il y ai du texte qui apparaissent dans un label par exemple ?merci Une image dans une picturebox et un zoom de au dessus du curseur dans une autre [ par captaincav ] salou :)bon, j'explique mon probleme, meme si ca va pas etre tres evident huhuvoila, j'ai 2 picturebox, une avec une image dedans (que l'on va appeler deplacement d'une image en maintenant enfonce le bt gauche de la souris [ par ced74 ] Je veux realiser un scrollbar ou on puisse mettre de image sur le bouton Haut,bas la barre du centre.Pour cela il faut que je deplace une image dans u faire suive une image a la souris [ par olicool ] J'ai un problème. Je voudrais qu mon image ,quand je clique a un endroit sur la form. Elle avance vers la souris mais il ne faut pas quelle apparaise deplacement image ds form(a la souris) [ par pcpunch ] sltje cherche a faire bouger a l aide de la souris un controle image qui se trouve sur ma form? comment faire afin de ne pas utiliser des boutons de d PaintPicture [ par ChrisFAPS ] Slt,Voila, j'ai un control picturebox et un control image. Je souhaiterais afficher dans le control image une partie de la picturebox.picture (delimit PictureBox <> Image Control [ par bluelive ] BlueLiveJ'ai le problème suivant.Si j'utilise un PictureBox avec une image bmp ou gif (disons que cette image fait 200px sur 200px), cette image ne s' image viewer - viewport [ par g2000 ] j'essaye de developper un viewport avec les fonctionnalites suivantes:-zoom-scrolling-recuperation des coordonnees de l'image dans le repere de l'imag


Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 3,167 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales