Concaténer plusieurs images

Résolu
collargol123 Messages postés 86 Date d'inscription jeudi 24 octobre 2013 Statut Membre Dernière intervention 2 avril 2014 - 23 janv. 2014 à 23:53
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 - 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

12 réponses

jordane45 Messages postés 38134 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 11 avril 2024 344
24 janv. 2014 à 00:44
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
0
NHenry Messages postés 15111 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 11 avril 2024 159
25 janv. 2014 à 23:15
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.
0
collargol123 Messages postés 86 Date d'inscription jeudi 24 octobre 2013 Statut Membre Dernière intervention 2 avril 2014
Modifié par jordane45 le 11/03/2014 à 15:33
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
0
collargol123 Messages postés 86 Date d'inscription jeudi 24 octobre 2013 Statut Membre Dernière intervention 2 avril 2014
Modifié par jordane45 le 11/03/2014 à 15:31
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")
0
jordane45 Messages postés 38134 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 11 avril 2024 344
11 mars 2014 à 15:32
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
11 mars 2014 à 11:59
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:\"
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
11 mars 2014 à 14:18
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
0
collargol123 Messages postés 86 Date d'inscription jeudi 24 octobre 2013 Statut Membre Dernière intervention 2 avril 2014
12 mars 2014 à 22:19
Bonsoir,

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

Sinon, j'ai testé ton code cs-Pivert et malheureusement tjrs un bug ...
0
NHenry Messages postés 15111 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 11 avril 2024 159
12 mars 2014 à 22:34
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".
0
collargol123 Messages postés 86 Date d'inscription jeudi 24 octobre 2013 Statut Membre Dernière intervention 2 avril 2014
20 mars 2014 à 01:28
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 !
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
20 mars 2014 à 08:05
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!!!!!!!!!!!!!!
0
collargol123 Messages postés 86 Date d'inscription jeudi 24 octobre 2013 Statut Membre Dernière intervention 2 avril 2014
28 mars 2014 à 00:15
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.
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
28 mars 2014 à 07:56
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

0
collargol123 Messages postés 86 Date d'inscription jeudi 24 octobre 2013 Statut Membre Dernière intervention 2 avril 2014
2 avril 2014 à 23:16
Bonsoir Pivert,

Merci cela fonctionne.
J'ai adapté ton code et l'ai placé dans la sub me.activated.
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
29 avril 2014 à 12:06
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
0
Rejoignez-nous