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

VB.NET Discussion :

Images & Layers


Sujet :

VB.NET

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 11
    Points : 9
    Points
    9
    Par défaut Images & Layers
    Bonjour,

    Je me permets d'écrire car j'ai une problématique que je n'arrive pas à résoudre.
    Je suis Débutant ++

    Mon problème :

    J'ai une image de fond sur laquelle je souhaite drag & drop des images
    Comme si j'avais une image de parking sur laquelle je souhaite placer avec la souris des images de voiture.

    J'aimerai aussi pouvoir déplacer les voitures que j'ai mis sur mon image de fond avec la souris.

    Et pour finir faire la fusion de toutes mes images de voiture et mon image de fond pour enregistrer une image sur mon HD

    Actuellement mon dev :

    J'ai un panel dans lequel j'ai une PictureBox avec mon image de fond.
    c'est le début du dev, il n'y a pas la gestion du drag & drop
    Le problème est le fait que les images sont fusionnées.
    j'ai fait différents essais mais je bloque, je sais pas comment faire ou choisir tels ou tels composants, librairies.

    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
            Dim objBitMap As Bitmap = Image.FromFile(Application.StartupPath & "\SaveMaps\MapForToken.jpg")
            Dim PictureBoxToken As New PictureBox
            PictureBoxToken.AllowDrop = True
            PictureBoxToken.SizeMode = PictureBoxSizeMode.AutoSize
            PictureBoxToken.Image = objBitMap
            Panel1.Controls.Add(PictureBoxToken)
     
     
            Dim objBMP As Bitmap = Image.FromFile(Application.StartupPath & "\Modules\Picto.png")
            Dim objPictureBoxAssets As New PictureBox
            objPictureBoxAssets.Name = "PictureBox_aze"
            objPictureBoxAssets.AllowDrop = True
            objPictureBoxAssets.Height = 30
            objPictureBoxAssets.Width = 30
            objPictureBoxAssets.SizeMode = PictureBoxSizeMode.StretchImage
            objPictureBoxAssets.Image = objBMP
            objPictureBoxAssets.BringToFront()
     
            Panel1.Controls.Add(objPictureBoxAssets)
     
            Dim objGraphics As Graphics
            objGraphics = Graphics.FromImage(objBitMap)
            objGraphics.DrawImage(objBMP, New Point(30, 30))
    Je vous remercie d'avance pour votre aide car ce projet me tiens à cœur.

    Cordialement Joel

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    Apres pas mal de recherche j ai réussi à le faire et j ai rajouté la rotation sur le bouton du milieu

    par contre il y a t il un moyen simple pour faire la fusion entre les picturebox ?

    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
     
     
        Private Sub Panel1_Paint(sender As Object, e As PaintEventArgs) Handles Panel1.Paint
     
            Dim objBitMap As Bitmap = Image.FromFile(Application.StartupPath & "\SaveMaps\MapForToken.jpg")
            Dim PictureBoxMapToken As New PictureBox
            PictureBoxMapToken.AllowDrop = True
            PictureBoxMapToken.SizeMode = PictureBoxSizeMode.AutoSize
            PictureBoxMapToken.Image = objBitMap
            Panel1.Controls.Add(PictureBoxMapToken)
     
     
            Dim objBitMap1 As Bitmap = Image.FromFile(Application.StartupPath & "\Modules\Picto.png")
            Dim objPictureBoxToken As New PictureBox
            objPictureBoxToken.Name = "PictureBox33"
            objPictureBoxToken.AllowDrop = True
            objPictureBoxToken.Height = 40 'objBitMap1.Height
            objPictureBoxToken.Width = 40 'objBitMap1.Width
            objPictureBoxToken.BackColor = System.Drawing.Color.Sienna
            objPictureBoxToken.SizeMode = PictureBoxSizeMode.StretchImage
            objPictureBoxToken.Image = objBitMap1
            objPictureBoxToken.TabIndex = 0
            objPictureBoxToken.TabStop = False
            AddHandler objPictureBoxToken.MouseMove, AddressOf objPictureBoxToken_MouseMove
            AddHandler objPictureBoxToken.MouseClick, AddressOf ObjPictureBoxToken_MouseClick
     
            PictureBoxMapToken.Controls.Add(objPictureBoxToken)
     
     
        End Sub
        Private Sub objPictureBoxToken_MouseMove(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs)
     
            Static mousePosX As Single, mousePosY As Single
            If e.Button = 0 Then
                mousePosX = e.X
                mousePosY = e.Y
            Else
                sender.Left = sender.Left + (e.X - mousePosX)
                sender.Top = sender.Top + (e.Y - mousePosY)
            End If
     
        End Sub
     
     
        Private Sub ObjPictureBoxToken_MouseClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs)
     
            Dim source As PictureBox = DirectCast(sender, PictureBox)
     
            ' Start the drag if it's the right mouse button.
            If (e.Button = MouseButtons.Right And source.Image IsNot Nothing) Then
     
     
            ElseIf (e.Button = MouseButtons.Left And source.Image IsNot Nothing) Then
     
     
            ElseIf (e.Button = MouseButtons.Middle And source.Image IsNot Nothing) Then
     
                Dim Bitmap As New Bitmap(source.Image)
     
                Dim objBitMap As New Bitmap(Bitmap.Width, Bitmap.Height)
                objBitMap.SetResolution(Bitmap.HorizontalResolution, Bitmap.VerticalResolution)
     
                Dim objGraphics As Graphics = Graphics.FromImage(objBitMap)
                objGraphics.TranslateTransform(Bitmap.Width / 2, Bitmap.Height / 2)
                objGraphics.RotateTransform(30.0F)
                objGraphics.TranslateTransform(-Bitmap.Width / 2, -Bitmap.Height / 2)
                objGraphics.DrawImage(Bitmap, New Point(0, 0))
     
                source.Image = objBitMap
     
            End If
     
        End Sub

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2015
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2015
    Messages : 128
    Points : 109
    Points
    109
    Par défaut
    Tu te complique la vie à utiliser WinForms pour ça alors que si t'utilise du WPF tu peux faire tout ça tellement plus facilement

    Le support de WinForms pour là transparance est très limité, alors que sur WPF y'a pas de soucis, sur WPF les transformations/rotation/changement d'opacité se font avec juste une seule ligne de code, puis pour générer la photo finalle avec un tout ptit code tu peux faire une capture de l'interieur de ta fenetre, donc t'a pas à de te faire c**** à fusionner toutes les images dans un seul bitmap ..

  4. #4
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour
    Si tu veux superposer en couches des images sur un fond ("layering")
    1/ il faut te munir d'un class d'aide (helper ou utilitaire) denommé ci-dessous Layer
    2/ d'un list(of Layer)
    3/ utiliser le "painting" du controle PictureBox hebergeur denommé ci-dessous PicParking
    Ce PicParking est hébergé lui meme par un Panel scrollable .
    Scrollabe ? ca permet d'afficher l'image de fond dénommée Parking à sa dimension d'origine
    4/ pour plus de confort la liste de layers est affiché dans un DGV
    les layers disponible sont ancrés au point(0,0) du PicpParking et sont invisibles
    Pour activer un Layer il faut selectionner sa Row ,mettre Visible à True et (changer de Row et puis y revenir) pour le deplace
    le DGV permet de taper les Angles de rotation .
    Le déplacement d'un image se fait dans l'unique event MouseMove après sélection d'un Row du DGV.
    Pour valider un déplacement clic droit dans MouseUp.

    5/ pour enregister ton image "fusionnée" btnnnFusion.


    Code exemple du class Layer
    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
     
    Public Class Layer
        Public Property Visible As Boolean
        Public Property Angle As Single
        Public Property Image As Bitmap
        Public Property Nom As String
        Public Property Left As Integer
        Public Property Top As Integer
        Public ReadOnly Property Rect As Rectangle
            Get
                Return New Rectangle(Me.Left, Me.Top, Me.Image.Size.Width, Me.Image.Height)
            End Get
        End Property
        Public ReadOnly Property Center As PointF
            Get
                Return New PointF(Me.Left + Me.Rect.Width / 2, Me.Top + Me.Rect.Height / 2)
            End Get
        End Property
        Public Sub New()
            Me.Visible = True
            Me.Angle = 0.0
            Me.Image = Nothing
            Me.Nom = "nothing"
            Left = 0
            Me.Top = 0
        End Sub
    End Class
    Public Class Layers
        Inherits List(Of Layer)
    End Class
    code du form User :

    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
    118
    119
     
    Imports System.Drawing.Drawing2D
    Imports System.IO
    Public Class Form1
        Private layers As Layers
        Private parking As Bitmap = Nothing
        Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
            Me.DataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect
            Me.Panel1.AutoScroll = True
            Me.PicParking.Location = New Point()
            PicParking.SizeMode = PictureBoxSizeMode.AutoSize
            PicParking.BackColor = Color.Transparent
            parking = My.Resources.ParkingImage
            Me.PicParking.Image = parking
            PrepareListImages()
     
        End Sub
        Private Sub PrepareListImages()
            'peut etre fait dans le designer
            Me.ImageList1.ColorDepth = ColorDepth.Depth32Bit
            Me.ImageList1.ImageSize = New Size(64, 64)
            Me.ImageList1.Images.Add(My.Resources.image0)
            Me.ImageList1.Images.Add(My.Resources.image1)
            Me.ImageList1.Images.Add(My.Resources.image2)
            Me.ImageList1.Images.Add(My.Resources.image3)
     
     
            'assignation de chaque image à un layer 
            '& ajout a la liste layers
            layers = New Layers
     
            Dim name As String
            Dim lay As Layer
     
            For i As Integer = 0 To ImageList1.Images.Count - 1
                If i = 0 Then
                    name = "parking"
                Else
                    name = "bmp" + i.ToString
                End If
     
                lay = New Layer() With {
                     .Visible = False,
                     .Angle = 0.0,
                     .Nom = name,
                     .Left = 0,
                     .Top = 0,
                     .Image = ImageList1.Images(i)
                }
                layers.Add(lay)
            Next
            DataGridView1.DataSource = layers
        End Sub
     
     
     
        Private Sub PicParking_Paint(sender As System.Object, e As System.Windows.Forms.PaintEventArgs) Handles PicParking.Paint
            Dim gr As Graphics = e.Graphics
            For i As Integer = 0 To layers.Count - 1
                Dim item As Layer = layers(i)
                If Not item.Visible Then Continue For
                Using m As New Matrix
                    m.RotateAt(item.Angle, item.Center)
                    gr.Transform = m
                    gr.DrawImage(item.Image, item.Left, item.Top)
                End Using
            Next
     
        End Sub
        Private selLayer As Layer = Nothing
     
     
        Private Sub DataGridView1_CellEnter(sender As Object, e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellEnter
            If Me.DataGridView1.SelectedRows.Count = 1 Then
                selLayer = Me.DataGridView1.SelectedRows(0).DataBoundItem
            End If
            Me.PicParking.Invalidate()
        End Sub
        Private Sub DataGridView1_SelectionChanged(sender As System.Object, e As System.EventArgs) Handles DataGridView1.SelectionChanged
     
        End Sub
     
        Private Sub PicParking_MouseMove(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) Handles PicParking.MouseMove
            If selLayer Is Nothing Then Return
            selLayer.Left = e.X
            selLayer.Top = e.Y
            PicParking.Invalidate()
     
        End Sub
     
        Private Sub PicParking_MouseUp(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) Handles PicParking.MouseUp
            If selLayer Is Nothing Then Return
            If e.Button = Windows.Forms.MouseButtons.Right Then
                selLayer.Left = e.X
                selLayer.Top = e.Y
                PicParking.Invalidate()
                selLayer = Nothing
            End If
     
     
     
        End Sub
      Private Sub btnFusion_Click(sender As System.Object, e As System.EventArgs) Handles btnFusion.Click
            Dim bmpFusion As New Bitmap(PicParking.Image)
            Using gr As Graphics = Graphics.FromImage(bmpFusion)
                For i As Integer = 0 To layers.Count - 1
                    Dim item As Layer = layers(i)
                    If Not item.Visible Then Continue For
                    Using m As New Matrix
                        m.RotateAt(item.Angle, item.Center)
                        gr.Transform = m
                        gr.DrawImage(item.Image, item.Left, item.Top)
                    End Using
                Next
            End Using
            bmpFusion.Save(Directory.GetCurrentDirectory + "\saved.bmp")
     
        End Sub
    End Class
    bon code...

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    Merci beaucoup pour vos réponses, je vais essayer de voir le code de MABROUKI un de ces soirs.

    @+

Discussions similaires

  1. [Débutant] Afficher une image avec un layer
    Par aykeem dans le forum ASP.NET
    Réponses: 1
    Dernier message: 23/02/2015, 10h49
  2. Creation de layers sur image
    Par olibara dans le forum C#
    Réponses: 35
    Dernier message: 26/09/2008, 09h25
  3. [GeoTool] Coupler layers vectorielles + image raster
    Par othouven dans le forum SIG : Système d'information Géographique
    Réponses: 6
    Dernier message: 03/10/2007, 17h43

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