Concaténer plusieurs images [Résolu]

Messages postés
86
Date d'inscription
jeudi 24 octobre 2013
Statut
Membre
Dernière intervention
2 avril 2014
- - Dernière réponse : cs_Le Pivert
Messages postés
5990
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
19 avril 2019
- 29 avril 2014 à 12:06
Bonjour,

A défaut de pouvoir scanner en multipages (trop complexe en vbnet), et je ne comprends pas d'ailleurs pourquoi cela n'est pas possible (alors que mon scanner scanne en multipage et qu'il n'y avait aucun probleme en VB6), je dois concaténer mes images scannées.

J'ai donc le code ci-dessous qui marche très bien pour concaténer 2 images.
Mais si j'ai x images scannées, comment puis-je faire pour concaténer ces x images ?

Merci

Voici le code :

Dim Img1 As Bitmap = Image.FromFile("C:\23.01.2014 test1.TIF")
Dim Img2 As Bitmap = Image.FromFile("C:\23.01.2014 test2.TIF")
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
Img3.Save("C:\23.01.2014 COMBINE.TIF")
End Sub
Afficher la suite 

Votre réponse

12 réponses

Messages postés
25248
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
22 avril 2019
366
0
Merci
Bonjour,
J'ai donc le code ci-dessous qui marche très bien pour concaténer 2 images.
Mais si j'ai x images scannées, comment puis-je faire pour concaténer ces x images ?
.... une Boucle et/ou une fonction récursive (tu joints tes deux premières images..puis tu joints cette nouvelle image à ta troisième..etc. (x foix)..)





PS: merci d'utiliser la coloration syntaxique lorsque tu postes du code sur le forum :
VOIR ICI
Commenter la réponse de jordane45
Messages postés
14423
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
18 avril 2019
155
0
Merci
Bonsoir,

A la place de copier pixel par pixel, tu peux utiliser :

Graphics.FromImage(TonImage)

Pour ensuite dessiner dessus avec MonGraphics.DrawImage
Ce sera plus rapide et simple à maitriser, je pense.
Commenter la réponse de NHenry
Messages postés
86
Date d'inscription
jeudi 24 octobre 2013
Statut
Membre
Dernière intervention
2 avril 2014
0
Merci
Bonjour,

Merci pour l'info graphic .. que je vais étudier.
En attendant, j'ai adapté le code ci-dessous. Mais je rencontre le probleme suivant : lorsque je scanne 2 images voir plus, je ne peux pas supprimer l'image nommée img1 (lorsque i = 1) ; cf code

For i = 1 To j
My.Computer.FileSystem.DeleteFile("C:\image" & i & ".TIF")
Next.


Pourriez-vous me donner votre avis ?

'CODE POUR SCANNER
Dim i As Integer
        i = i + 1
        Dim img1, img2, img3 As Bitmap
        Dim Width As Integer
        Dim Height As Integer
        Dim x As Integer
        Dim y As Integer

        Result = EZTwain.AcquireToFileName(Me.Handle, "C:\image" & i & ".TIF")
        img1 = Image.FromFile("C:\image" & i & ".TIF")
        j = j + 1
  
encore:
        Select MsgBox("Continuer ?", MsgBoxStyle.YesNoCancel + MsgBoxStyle.DefaultButton1 + MsgBoxStyle.Information, "Scanner :")


            <gras>Case DialogResult.Yes</gras>

                i = i + 1
                Result = EZTwain.AcquireToFileName(Me.Handle, "C:\image" & i & ".TIF")
                img2 = Image.FromFile("C:\image" & i & ".TIF")

                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
                img3.Save("C:\combine" & i & ".TIF")
                img1 = img3
                img2.Dispose()
                j = j + 1
 
                GoTo encore

            <gras>Case DialogResult.No</gras>

                img3 = img1
                img3.Save(cheminScan & NomFichierScanne & ".TIF")

                If img1 IsNot Nothing Then
                    img1.Dispose()
                    img1 = Nothing
                End If
                If img3 IsNot Nothing Then
                    img3.Dispose()
                    img3 = Nothing
                End If
               
        <gras>    Case DialogResult.Cancel</gras>

                annuler = True
                If img1 IsNot Nothing Then
                    img1.Dispose()
                    img1 = Nothing
                End If

                For i = 1 To j
                    My.Computer.FileSystem.DeleteFile("C:\image" & i & ".TIF")
                Next
                For i = 2 To j
                    My.Computer.FileSystem.DeleteFile("C:\combine" & i & ".TIF")
                Next

                i = 0
                j = 0
                Exit Sub
        End Select


     
        For i = 1 To j
            My.Computer.FileSystem.DeleteFile("C:\image" & i & ".TIF")
        Next
        For i = 2 To j
            My.Computer.FileSystem.DeleteFile("C:\combine" & i & ".TIF")
        Next
        i = 0
        j = 0
Commenter la réponse de collargol123
Messages postés
86
Date d'inscription
jeudi 24 octobre 2013
Statut
Membre
Dernière intervention
2 avril 2014
0
Merci
Voici finalement le code en m'inspirant de
http://kuljeetsingh.com/Saving-Multiple-Images-in-Multipage-Tiff

Mais je n'arrive pas à supprimer les images placées sur le disque C et c'est toiujours la derniere image qui fairt bugger
ex si j'ai 2 images
image0 est supprimée mais image1 fait bugger

Une idée
'------ SCANNER ---------------------
        'creer la variable recevant le scann
        Dim Result As Integer, f As Integer
        ' Create image.
        Result = EZTwain.AcquireToFileName(Me.Handle, "C:\image" & f & ".bmp")

        'on ajouter l'image scannée dans une listbox
        ListBox1.Items.Add("C:\image" & f & ".bmp")

encore:
        Select Case MsgBox("Continuer ?", MsgBoxStyle.YesNoCancel + MsgBoxStyle.DefaultButton1 + MsgBoxStyle.Information, "Scanner :")

            Case DialogResult.Yes
                f = f + 1
                Result = EZTwain.AcquireToFileName(Me.Handle, "C:\image" & f & ".bmp")
                ListBox1.Items.Add("C:\image" & f & ".bmp")
                GoTo encore

            Case DialogResult.No
                Try
                    Dim panelarr As New ArrayList
                    For Each strpath As String In ListBox1.Items
                        panelarr.Add(New Bitmap(strpath))
                    Next
                    'Create the BitMap File with first image Dim bmp As Image = panelarr.Item(0)
                    Dim bmp As Image = panelarr.Item(0)
                    Dim MasterBitmap As Bitmap = CType(bmp, Bitmap)

                    'Select the image encoder
                    Dim enc As Encoder = Encoder.SaveFlag
                    Dim info As ImageCodecInfo = Nothing
                    Dim ice As ImageCodecInfo
                    For Each ice In ImageCodecInfo.GetImageEncoders()
                        If ice.MimeType = "image/tiff" Then
                            info = ice
                        End If
                    Next ice
                    Dim ep As New EncoderParameters(1)
                    ep.Param(0) = New EncoderParameter(enc, CLng(EncoderValue.MultiFrame))
                    'Save the master bitmap
                    MasterBitmap.Save(cheminScan & NomFichierScanne & ".TIF", info, ep)
                    ep.Param(0) = New EncoderParameter(enc, CLng(EncoderValue.FrameDimensionPage))
                    'add all images from index 1 to n
                    Dim i As Integer
                    For i = 1 To (panelarr.Count) - 1
                        MasterBitmap.SaveAdd(CType(panelarr(i), Bitmap), ep)
                    Next i
                    ep.Param(0) = New EncoderParameter(enc, CLng(EncoderValue.Flush))
                    'close out the file.
                    MasterBitmap.SaveAdd(ep)
                    i = 0
                    ' Shell("RunDll32.exe shimgvw.dll,ImageView_Fullscreen " + cheminScan & NomFichierScanne & ".TIF")
                    'Return
                
                Catch ee As System.Exception
                    Throw New Exception(ee.Message & " Error in saving as multipage ")
                End Try
            Case DialogResult.Cancel
                annuler = True
        End Select

        Dim g As Integer
        For g = 0 To ListBox1.Items.Count - 2
            File.Delete("C:\image" & g & ".bmp")
        Next

      
        Shell("RunDll32.exe shimgvw.dll,ImageView_Fullscreen " + cheminScan & NomFichierScanne & ".TIF")
jordane45
Messages postés
25248
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
22 avril 2019
366 -
J'ai édité ton message pour y mettre les balises de code...
Comme je te l'avais déjà indiqué.. tu trouveras des informations sur leur utilisation à cette adresse :
http://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code
Commenter la réponse de collargol123
Messages postés
5990
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
19 avril 2019
79
0
Merci
Bonjour,

J'ai fait un essai dans un dossier où j'ai mis des images. Dans la listBox il y a le chemin complet de ces images. Voici le code qui fonctionne:


Dim g As Integer 'nombre d'images
Dim nom As String 'chemin complet
For g = 0 To ListBox1.Items.Count - 1
nom = ListBox1.Items(g).ToString
File.Delete(nom)
Next

Je pense que tu devrais créer un dossier temp au lieu de les mettre dans "C:\"
cs_Le Pivert
Messages postés
5990
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
19 avril 2019
79 -
Dans ton code l'erreur se situe dans cette ligne:

File.Delete("C:\image" & g & ".bmp") 

g est l'index de ta listBox et non pas le numéro de ton image!!!!!!!!

Pour que ton code fonctionne met ceci:

Dim g As Integer
Dim nom As String

For g = 0 To ListBox1.Items.Count - 1
nom = ListBox1.Items(g).ToString
File.Delete("C:\image" & nom & ".bmp")
Next

PS essaie de mettre ton code dans les balises pour une meilleure lisibilité

balise en haut à droite.

Merci
Commenter la réponse de cs_Le Pivert
Messages postés
86
Date d'inscription
jeudi 24 octobre 2013
Statut
Membre
Dernière intervention
2 avril 2014
0
Merci
Bonsoir,

La prochaine fois je mettrai effectivement des balises. Désolé.

Sinon, j'ai testé ton code cs-Pivert et malheureusement tjrs un bug ...
NHenry
Messages postés
14423
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
18 avril 2019
155 -
Quand tu libère une image, au lieu de juste "oublier" le lien vers celle-ci pour que le ramasse-miettes ne vienne la libérer, appelles sa méthode "Dispose".
Commenter la réponse de collargol123
Messages postés
86
Date d'inscription
jeudi 24 octobre 2013
Statut
Membre
Dernière intervention
2 avril 2014
0
Merci
Quand tu libère une image, au lieu de juste "oublier" le lien vers celle-ci pour que le ramasse-miettes ne vienne la libérer, appelles sa méthode "Dispose".

meme en faisant
 listbox1.dispose
ou
 me.dispose
tjrs un bugg !
Enervant de devoir supprimer manuellement ces images bmp !
Commenter la réponse de collargol123
Messages postés
5990
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
19 avril 2019
79
0
Merci
Quand NHenry te dit:

Quand tu libère une image, au lieu de juste "oublier" le lien vers celle-ci pour que le ramasse-miettes ne vienne la libérer, appelles sa méthode "Dispose".

C'est au bitmap qu'il faut mettre .Dispose!!!!!!!!!!!!!!
Commenter la réponse de cs_Le Pivert
Messages postés
86
Date d'inscription
jeudi 24 octobre 2013
Statut
Membre
Dernière intervention
2 avril 2014
0
Merci
Bonsoir

Décidément je ne m'en sors pas !
même en faisant bitmap.dispose, tjrs un bug ...

En fait le bug a lieu sur la premiereimage scannée (0) car siu je veux la supprimer en allant directement sur le disque C je ne peux absolument pas.
Commenter la réponse de collargol123
Messages postés
5990
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
19 avril 2019
79
0
Merci
J'ai eu ce problème dans un de mes programmes. La solution que j'ai trouvé, c'est de supprimer l'image récalcitrante à l'ouverture de l'application. Je sais que cela n'est pas très orthodoxe, je n'ai trouvé que ça!

A mettre dans l'évènement Form1_Load

 'suppression fichier image
If File.Exists("chemin fichier") Then
Try
File.Delete("chemin fichier")
Catch ex As Exception
MessageBox.Show(ex.Message, "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End If

Commenter la réponse de cs_Le Pivert
Messages postés
86
Date d'inscription
jeudi 24 octobre 2013
Statut
Membre
Dernière intervention
2 avril 2014
0
Merci
Bonsoir Pivert,

Merci cela fonctionne.
J'ai adapté ton code et l'ai placé dans la sub me.activated.
Commenter la réponse de collargol123
Messages postés
5990
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
19 avril 2019
79
0
Merci
Bonjour collargol123 ,

Je relance ce post, car j'ai trouvé une solution pour supprimer l'image à la fermeture de l'application:

Option Strict On
Imports System.IO
Public Class Form1
Private Sub Form1_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
supprimer("chemin fichier image.jpg", PictureBox1)
End Sub
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
PictureBox1.Image = Image.FromFile("chemin fichier image.jpg.jpg")
End Sub
Private Sub supprimer(ByVal chemin As String, ByVal pic As PictureBox)
If Not (pic.Image Is Nothing) Then
pic.Image.Dispose()
pic.Image = Nothing
End If
' Créer le FileStream sur le fichier vimage
Dim MyStream As FileStream = New FileStream(chemin, FileMode.Open)
' affecter l'image à pictureBox
pic.Image = Image.FromStream(MyStream)
' libérer les ressources
MyStream.Close()
' supprimer le fichier vimage
File.Delete(chemin)
MessageBox.Show("Fichier supprimé ", "Suppression", MessageBoxButtons.OK, MessageBoxIcon.Information)
End Sub
End Class

Si cela peut servir
Commenter la réponse de cs_Le Pivert

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.