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.
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.