Mergeimages

Description

Assembler 2 images pour n'en faire qu'une. Vous ouvrez 2 images de même hauteur en pixel et de même orientation portrait ou paysage. Ceux sont les seules contraintes pour la réussite de l'opération.L'enregistrement est automatique dans le dossier Debug de l'application. Vous visionnez immédiatement le résultat.
Voici 2 méthodes de MergeImages. Dans la première il faut connaitre la résolution ppp de l'image, le résultat est en orientation Paysage ou en Portrait au choix (rapidité d'exécution) et dans le seconde en Portrait uniquement(beaucoup plus lente).
Il ne vous reste plus qu'à ouvrir un nouveau projet ajouter un bouton, un GroupBox dans lequel vous mettez 2 RadioButtons, un 2ème GroupBox dans lequel vous mettez également 2 RadioButtons et à copier le code ci-dessous. Bonne programmation
Pour ceux qui veulent aller plus loin. Combiner 4 images. Téléchargez le zip. Toujours la même recommandation: les 4 images doivent avoir la même hauteur et la même orientation.

Source / Exemple :


Option Explicit On
Option Strict On
Imports System.Drawing.Imaging
Public Class Form1
    'déclarations
    Dim MergedImage, monImage, Pic1, Pic2 As Image
    Dim Wide, High, Decalage As Double ' dimension de merged image 
    Dim resolution, resolution1, resolution2 As Single
    Dim cheminimage, chemin1, chemin2 As String
    Dim chemin As String = Application.StartupPath & "\MergedImage.jpg"
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Button1.Text = "Ouvrir images"
        Button1.AutoSize = True
        GroupBox1.Text = "Résultat"
        RadioButton1.Text = "1ère méthode"
        RadioButton2.Text = "2ème méthode"
        RadioButton1.Checked = True
        GroupBox2.Text = "Orientation"
        RadioButton3.Text = "Paysage"
        RadioButton4.Text = "Portrait"
        RadioButton3.Checked = True
    End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Pic1 = open(False) ' 1ère image
        If Pic1 Is Nothing Then Exit Sub
        chemin1 = cheminimage
        resolution1 = resolution 'résolution ppp
        Pic2 = open(True) ' seconde image
        If Pic2 Is Nothing Then Exit Sub
        chemin2 = cheminimage
        resolution2 = resolution
        If resolution1 = resolution2 _
        AndAlso Pic1.Height = Pic2.Height _
        Then 'résolution ppp et hauteur image ok
            If RadioButton1.Checked = True Then
                MergeImages(Pic1, Pic2) 'orientation paysage ou portrait
            Else
                MergeImages_2() 'orientation portrait
            End If
        Else
            MessageBox.Show("Incompatibilité entre les 2 images!", "Impossibilité", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Exit Sub
        End If
    End Sub
     'Fonction de ADN56 
    Private Function open(ByVal second_image As Boolean) As Image
        'Mise en place d'un objet OpenFileDialog pour ouvrir un fichier image 
        Dim openFD As New OpenFileDialog
        With openFD
            .Filter = "JPeg Files (*.jpg,*.jpeg)|*.jpg;*.jpeg|Bitmap Files (*.bmp)|*.bmp|Gif Files (*.gif)|*.gif|Icon Files (*.ico)|*.ico|Png Files (*.png)|*.png"
            .FilterIndex = 1
            .Title = "Sélectionnez le fichier image que vous souhaitez ouvrir."

            'Affiche et attend la fermeture de la boite de dialogue
            If .ShowDialog() = DialogResult.OK And _
                Not (.FileName Is Nothing) Then 'si clic sur OK et nom de fichier <> nothing attribu l'image
                monImage = Image.FromFile(openFD.FileName)
                cheminimage = (openFD.FileName)
                resolution = monImage.HorizontalResolution 'résolution ppp
                If monImage.Width > monImage.Height Then
                    RadioButton4.Checked = True
                Else
                    RadioButton3.Checked = True
                End If
            Else
                MessageBox.Show("Opération annulée par l'utilisateur!", "Ouverture image", MessageBoxButtons.OK, MessageBoxIcon.Error)
                Return Nothing
                Exit Function
            End If
        End With
        openFD.Dispose()
        Return monImage
    End Function
    'Fonction 1ère méthode résultat(rapidité)
    ' http://blogs.vbcity.com/xtab/archive/2006/09/21/6213.aspx
    Public Function MergeImages(ByVal Pic1 As Image, ByVal Pic2 As Image) As Image
        'Calcul de la largeur et la hauteur nécessaire pour l'image composite
        If RadioButton3.Checked = True Then
            Select Case resolution 'orientation paysage
                Case 72 '72ppp
                    Wide = Pic1.Width * 2.5
                    High = Pic1.Height * 1.25
                    Decalage = Pic1.Width * 1.25
                Case 96 '96ppp
                    Wide = Pic1.Width * 2
                    High = Pic1.Height
                    Decalage = Pic1.Width
                Case 180 '180ppp
                    Wide = Pic1.Width
                    High = Pic1.Height / 2
                    Decalage = Pic1.Width / 2
                Case 300 '300ppp
                    Wide = Pic1.Width / 1.6
                    High = Pic1.Height / 3.2
                    Decalage = Pic1.Width / 3.2
            End Select
        Else
            Select Case resolution 'orientation portrait
                Case 72 '72ppp
                    High = Pic1.Height * 2.5
                    Wide = Pic1.Width * 1.25
                    Decalage = Pic1.Height * 1.25
                Case 96 '96ppp
                    High = Pic1.Height * 2
                    Wide = Pic1.Width
                    Decalage = Pic1.Height
                Case 180 '180ppp
                    High = Pic1.Height
                    Wide = Pic1.Width / 2
                    Decalage = Pic1.Height / 2
                Case 300 '300ppp
                    High = Pic1.Height / 1.6
                    Wide = Pic1.Width / 3.2
                    Decalage = Pic1.Height / 3.2
            End Select
        End If
        'Créer un bitmap vide de la bonne taille à tenir les deux images côte à côte
        Dim bm As New Bitmap(CInt(Wide), CInt(High))
        'Obtenir l'objet Graphics pour ce bitmap
        Dim gr As Graphics = Graphics.FromImage(bm)
        'Dessine l'image première source sur le côté gauche de la nouvelle image
        gr.DrawImage(Pic1, 0, 0)
        If RadioButton3.Checked = True Then 'orientation paysage
            'Dessine l'image seconde source, le décalage vers le bord droit de l'image de la première source
            gr.DrawImage(Pic2, CInt(Decalage), 0)
        Else 'orientation portrait
            'Dessine l'image seconde source, le décalage vers le bas de l'image de la première source
            gr.DrawImage(Pic2, 0, CInt(Decalage))
        End If
        'Attribuer le bitmap fusionnés que vous venez de créer à l'image; 'vous allez revenir pour l'impression
        MergedImage = bm
        'sauvegarder l'image
        bm.Save(chemin, ImageFormat.Jpeg)
        'Ouvrir l'image
        Process.Start(chemin)
        'Finir avec l'objet Graphics
        gr.Dispose()
        gr = Nothing
        'Vous avez maintenant une image nommée MergedImage que vous pouvez imprimer.
        Return MergedImage
    End Function
    '2ème méthode résultat portrait(plus lente)
    ' http://www.codeguru.com/forum/showthread.php?t=340463
    Private Sub MergeImages_2()
        Dim Img1 As Bitmap = CType(Image.FromFile(chemin1), Bitmap)
        Dim Img2 As Bitmap = CType(Image.FromFile(chemin2), Bitmap)
        Dim Img3 As Bitmap
        Dim Width As Integer
        Dim Height As Integer
        Dim x As Integer
        Dim y As Integer

        If Img1.Width > Img2.Width Then
            Width = Img1.Width
        Else
            Width = Img2.Width
        End If

        Height = Img1.Height + Img2.Height
        Img3 = New Bitmap(Width, Height)

        For x = 0 To Img1.Width - 1
            For y = 0 To Img1.Height - 1
                Img3.SetPixel(x, y, Img1.GetPixel(x, y))
            Next
        Next
        For x = 0 To Img2.Width - 1
            For y = 0 To Img2.Height - 1
                Img3.SetPixel(x, y + Img1.Height, Img2.GetPixel(x, y))
            Next
        Next
        'sauvegarder l'image
        Img3.Save(chemin)
        'Ouvrir l'image
        Process.Start(chemin)
    End Sub
End Class

Conclusion :


Merci à ADN56, qui m'a bien aidé lors de ma précédent source. Je me suis donc servi de sa fonction d'ouverture de fichier. Le reste je l'ai adapté des sites qui figurent dans le code. Merci aussi à ces sites.

Codes Sources

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.