Mettre une Image en Noir et Blanc/Sépia/../Version d'origine [Résolu]

kikou93 418 Messages postés mardi 4 février 2014Date d'inscription 24 septembre 2018 Dernière intervention - 20 sept. 2016 à 23:09 - Dernière réponse : kikou93 418 Messages postés mardi 4 février 2014Date d'inscription 24 septembre 2018 Dernière intervention
- 24 sept. 2016 à 15:22
Bonjour ou Bonsoir,
Je suis entrain de créer un logiciel me permettant de changer la couleur d'une image, il contient :
TextBox (Nom : Chemin) " Le chemin d’accès de l'image"
PictureBox1 "Image"
Bouton "Noir et Blanc"
Bouton "Sépia"
Bouton "Version d'origine"
Bouton "Enregistrer les modifications"
j'ai pu trouver un code qui satisfait mets exigences ( un code créé par cs_Le Pivert ), je l'ai adopté a mon logiciel
le code suivant et affecter au bouton "Version d'origine" :
Dim img As Image
Dim image_attr As New ImageAttributes
Dim cm As ColorMatrix
Dim bm As Bitmap
Dim gr As Graphics
Dim ext As String
Dim r As Integer
img = Image.FromFile(Chemain.Text)
r = CInt(img.VerticalResolution.ToString) 'resolution image
ext = System.IO.Path.GetExtension(Chemain.Text) 'extension
Dim rect As Rectangle = Rectangle.Round(img.GetBounds(GraphicsUnit.Pixel))
Dim wid As Integer = img.Width
Dim hgt As Integer = img.Height
' Noir et blanc
bm = New Bitmap(wid, hgt)
gr = Graphics.FromImage(bm)
cm = New ColorMatrix(New Single()() _
{1.00, 0.00, 0.00, 0, 0}, _
New Single() {0.0, 1.0, 0.0, 0, 0}, _
New Single() {0.0, 0.0, 1.0, 0, 0}, _
New Single() {0, 0, 0, 1.0, 0}, _
New Single() {0.0, 0.0, 0.0, 0, 1.0}})
image_attr.SetColorMatrix(cm)
gr.DrawImage(img, rect, 0, 0, wid, hgt, GraphicsUnit.Pixel, image_attr)
PictureBox1.Image.Dispose()
PictureBox1.Image = bm

et le code suivant et affecter au bouton "Noir et Blanc" :
Dim img As Image
Dim image_attr As New ImageAttributes
Dim cm As ColorMatrix
Dim bm As Bitmap
Dim gr As Graphics
Dim ext As String
Dim r As Integer
img = Image.FromFile(Chemain.Text)
r = CInt(img.VerticalResolution.ToString) 'resolution image
ext = System.IO.Path.GetExtension(Chemain.Text) 'extension
Dim rect As Rectangle = Rectangle.Round(img.GetBounds(GraphicsUnit.Pixel))
Dim wid As Integer = img.Width
Dim hgt As Integer = img.Height
' Noir et blanc
bm = New Bitmap(wid, hgt)
gr = Graphics.FromImage(bm)
cm = New ColorMatrix(New Single()() _
{New Single() {0.3, 0.3, 0.3, 0, 0}, _
New Single() {0.59, 0.59, 0.59, 0, 0}, _
New Single() {0.11, 0.11, 0.11, 0, 0}, _
New Single() {0, 0, 0, 1, 0}, _
New Single() {0, 0, 0, 0, 1}})
image_attr.SetColorMatrix(cm)
gr.DrawImage(img, rect, 0, 0, wid, hgt, GraphicsUnit.Pixel, image_attr)
PictureBox1.Image.Dispose()
img.Dispose()
GC.Collect()
My.Computer.FileSystem.DeleteFile(Chemain.Text, UIOption.AllDialogs, RecycleOption.SendToRecycleBin) 'envoie le fichier à la corbeille
SaveImage(bm, Chemain.Text, ext, r)
PictureBox1.Image = bm

mais il y'a un problème si je clique sur le bouton "Noir et Blanc" après sur le bouton "Version d'origine" rien ne change parce que la version noir et blanc deviendras la version d'origine
cette partie du code :
 PictureBox1.Image.Dispose()
img.Dispose()
GC.Collect()
My.Computer.FileSystem.DeleteFile(Chemain.Text, UIOption.AllDialogs, RecycleOption.SendToRecycleBin) 'envoie le fichier à la corbeille
SaveImage(bm, Chemain.Text, ext, r)
PictureBox1.Image = bm

permet de supprimer l'image et enregistrer l'image modifiée avec le même mot, la même format et dans le même emplacement
j'ai essayé de le séparer du code "Noir et Blanc" et le mettre dans le Bouton "Enregistrer les modifications"
Bien sûr j'ajoute en haut :
Imports System.IO
Imports Microsoft.VisualBasic.FileIO
Imports System.Drawing.Imaging

et la fonction suivante :
 Public Sub SaveImage(ByVal btmp As Bitmap, ByRef cheminDestination As String, ByVal extension As String, ByVal resolution As Integer)
btmp.SetResolution(resolution, resolution) 'resolution origine
'sauvegarde le tout dans l'extension d'origine
Select Case extension
Case ".jpg"
btmp.Save(cheminDestination, Imaging.ImageFormat.Jpeg)
Case ".bmp"
btmp.Save(cheminDestination, Imaging.ImageFormat.Bmp)
Case ".gif"
btmp.Save(cheminDestination, Imaging.ImageFormat.Gif)
Case ".tif"
btmp.Save(cheminDestination, Imaging.ImageFormat.Tiff)
Case ".png"
btmp.Save(cheminDestination, Imaging.ImageFormat.Png)
Case Else
btmp.Save(cheminDestination, Imaging.ImageFormat.Jpeg)
End Select
End Sub

le problème et en cliquant sur le bouton "Enregistrer les modifications" une erreur s'affiche
pouvez-vous m'aider s'il vous plaît à résoudre ce problème
Merci pour votre aide
Afficher la suite 

Votre réponse

16 réponses

Meilleure réponse
cs_Le Pivert 5447 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 17 octobre 2018 Dernière intervention - Modifié par cs_Le Pivert le 23/09/2016 à 18:16
2
Merci
Bonjour,

Tu dis un code créé par cs_Le Pivert. Mais où as tu vu cela dans mon code:

 image_attr.SetColorMatrix(cm)
 gr.DrawImage(img, rect, 0, 0, wid, hgt, GraphicsUnit.Pixel, image_attr)
        PictureBox1.Image.Dispose()
        img.Dispose()
        GC.Collect()
        My.Computer.FileSystem.DeleteFile(Chemain.Text, UIOption.AllDialogs, RecycleOption.SendToRecycleBin) 'envoie le fichier à la corbeille
        SaveImage(bm, Chemain.Text, ext, r)
        PictureBox1.Image = bm


Voici une partie de mon code:

  image_attr.SetColorMatrix(cm)
        gr.DrawImage(picLeft.Image, rect, 0, 0, wid, hgt, GraphicsUnit.Pixel, image_attr)
        picLeft.Image = bm
        SaveImage(bm, chemin & "\" & ToolStriptxtchemin.Text & "_sepia" & ext, ext, r)


Tu supprimes et ensuite tu voudrais pouvoir l'enregistrer!

Je viens de voir une autre erreur: L'extension!

  SaveImage(bm, Chemain.Text, ext, r)


si tu avais copié correctement cela donnait ceci:

  SaveImage(bm, Chemain.Text & ext,  ext, r)


et je pense qu'il manque aussi le nom du fichier!

Bon courage

Voici le programme en question:

http://codes-sources.commentcamarche.net/source/100589-visionneuse-d-image

@+ Le Pivert

Merci cs_Le Pivert 2

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 93 internautes ce mois-ci

kikou93 418 Messages postés mardi 4 février 2014Date d'inscription 24 septembre 2018 Dernière intervention - 23 sept. 2016 à 19:25
merci pour ta réponse cs_Le Pivert
j'ai aussi dit que je l'avais modifié
et pour chemin.text
il contient par exemple : " ‪D:\Images\Image_N_1.jpg"
pourquoi j'ajouterai "ext", ça deviendra : ‪"D:\Images\Image_N_1.jpg.jpg" ca ne sera pas considéré comme une erreur
cs_Le Pivert 5447 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 17 octobre 2018 Dernière intervention > kikou93 418 Messages postés mardi 4 février 2014Date d'inscription 24 septembre 2018 Dernière intervention - 24 sept. 2016 à 07:53
Avec ces explications, je comprends mieux, tu veux écraser le fichier et le remplacer par un autre. De cette façon tu ne peux pas y arriver, car le fichier n'est supprimé qu' a la fermeture de ton application. En cherchant un peu je suis tombé sur ce post qui t'explique que c'est le mode d'ouverture qui te permet de supprimer le fichier par la suite:

https://openclassrooms.com/forum/sujet/vb-net-changer-l-image-d-un-picturebox-53646

Voici le code que j'ai fait pour tester:

'https://openclassrooms.com/forum/sujet/vb-net-changer-l-image-d-un-picturebox-53646
Public Class Form1
    Dim chemin As String = "C:\Users\Daniel\Documents\Créte_NB.jpg"
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Using monstream As New IO.FileStream(chemin, IO.FileMode.Open)
            PictureBox1.Image = Image.FromStream(monstream)
        End Using
    End Sub
    Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
        PictureBox1.Image = Nothing
        My.Computer.FileSystem.DeleteFile(chemin, FileIO.UIOption.AllDialogs, FileIO.RecycleOption.SendToRecycleBin) 'envoie le fichier à la corbeille
    End Sub
End Class

il va falloir que tu corriges le mode d'ouverture de ton image. Je te laisse le faire

Bon courage

@+ Le Pivert
cs_Le Pivert 5447 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 17 octobre 2018 Dernière intervention - 24 sept. 2016 à 11:58
J'ai trouvé ce post qui traite exactement du même sujet avec les explications:

http://codes-sources.commentcamarche.net/forum/affich-1640387-vb-2008-une-erreur-generique-s-est-produite-dans-gdi#11
cs_Le Pivert 5447 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 17 octobre 2018 Dernière intervention > cs_Le Pivert 5447 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 17 octobre 2018 Dernière intervention - 24 sept. 2016 à 14:22
voici un exemple de code qui ouvre une image couleur, la converti en noir et blanc et l'enregistre ensuite en écrasant le fichier d'origine:

Option Strict On
Imports System.IO
Imports System.Drawing
Imports System.Drawing.Imaging

Public Class Form1
    Dim chemin As String
    'Noir et blanc 
    Dim image_attr As New ImageAttributes
    Dim cm As ColorMatrix
    Dim bm As Bitmap
    Dim gr As Graphics
  
    'ouvrir image
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim myStream As Stream = Nothing
        Dim ofd As New OpenFileDialog()
        With ofd
            .InitialDirectory = "c:\"
            .Filter = "Image (*.jpg)|*.jpg"
            .RestoreDirectory = True
            If .ShowDialog() = System.Windows.Forms.DialogResult.OK Then
                Try
                    myStream = .OpenFile()
                    chemin = .FileName 'chemin fichier image
                    If (myStream IsNot Nothing) Then
                        PictureBox1.Image = Image.FromStream(myStream)
                    End If
                Catch Ex As Exception
                    MessageBox.Show("Vous ne pouvez pas lire le fichier à partir du disque. Erreur d'origine: " & Ex.Message)
                Finally
                    ' Cochez cette fois, puisque nous devons nous assurer que nous ne sommes pas jeter une exception à l'ouverture.
                    If (myStream IsNot Nothing) Then
                        myStream.Close()
                    End If
                End Try
            End If
        End With
    End Sub
    'enregistrer en noir et blanc en écrasant le fichier d'origine
    Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
        If PictureBox1.Image Is Nothing Then Exit Sub
        Dim rect As Rectangle = Rectangle.Round(PictureBox1.Image.GetBounds(GraphicsUnit.Pixel))
        Dim wid As Integer = PictureBox1.Image.Width
        Dim hgt As Integer = PictureBox1.Image.Height
        ' Noir et blanc
        bm = New Bitmap(wid, hgt)
        gr = Graphics.FromImage(bm)
        cm = New ColorMatrix(New Single()() _
               {New Single() {0.3, 0.3, 0.3, 0, 0}, _
               New Single() {0.59, 0.59, 0.59, 0, 0}, _
               New Single() {0.11, 0.11, 0.11, 0, 0}, _
               New Single() {0, 0, 0, 1, 0}, _
               New Single() {0, 0, 0, 0, 1}})
        image_attr.SetColorMatrix(cm)
        gr.DrawImage(PictureBox1.Image, rect, 0, 0, wid, hgt, GraphicsUnit.Pixel, image_attr)
        PictureBox1.Image = bm
        bm.Save(chemin, Imaging.ImageFormat.Jpeg)
    End Sub
End Class


faire de même pour le ton sépia

Bonne programmation

@+ Le Pivert
kikou93 418 Messages postés mardi 4 février 2014Date d'inscription 24 septembre 2018 Dernière intervention > cs_Le Pivert 5447 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 17 octobre 2018 Dernière intervention - 24 sept. 2016 à 15:22
Merci beaucoup cs_Le Pivert avec le dernier code que tu ma envoyer tout marche à merveille
Merci encore
Merci aussi cs_ShayW de m'avoir aidé, et de m'avoir consacré beaucoup de ton temps

Le code finale est ici
http://pasted.co/8a0ae209
si quelqu'un en a besoin
Commenter la réponse de cs_Le Pivert
NHenry 14273 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 16 octobre 2018 Dernière intervention - 20 sept. 2016 à 23:13
0
Merci
Quelle erreur ?
kikou93 418 Messages postés mardi 4 février 2014Date d'inscription 24 septembre 2018 Dernière intervention - 20 sept. 2016 à 23:28
Merci NHenry de m'avoir répondu aussi rapidement
je le met le code suivant dans le Bouton "Enregistrer les modifications" bien sûr je l’enlève du Bouton "Noir et Blanc") :
PictureBox1.Image.Dispose()
img.Dispose()
GC.Collect()
My.Computer.FileSystem.DeleteFile(Chemain.Text, UIOption.AllDialogs, RecycleOption.SendToRecycleBin) 'envoie le fichier à la corbeille
SaveImage(bm, Chemain.Text, ext, r)
PictureBox1.Image = bm

Quand je clique sur le Bouton "Noir et Blanc" l'image devient une image noir et blanc et quand je clique sur le Bouton "Enregistrer les modifications" l'erreur (Le paramètre n'est pas valide.) apparaît sur la ligne suivante du Bouton "Enregistrer les modifications" :
  SaveImage(bm, Chemain.Text, ext, r)
kikou93 418 Messages postés mardi 4 février 2014Date d'inscription 24 septembre 2018 Dernière intervention > kikou93 418 Messages postés mardi 4 février 2014Date d'inscription 24 septembre 2018 Dernière intervention - 21 sept. 2016 à 09:46
Pourquoi si je sépare les deux bout de code il ne fonction pas
Normalement en cliquant dans le bouton "Noir et Blanc" j'attribue une valeur (Integer ou String) à (bm, ext, r)
Alors normalement ça marche comme si ils étaient fusionné (le code du bouton "Noir et Blanc" et le code du Bouton "Enregistrer les Modifications")
kikou93 418 Messages postés mardi 4 février 2014Date d'inscription 24 septembre 2018 Dernière intervention > kikou93 418 Messages postés mardi 4 février 2014Date d'inscription 24 septembre 2018 Dernière intervention - 22 sept. 2016 à 12:05
après quelque essais, je crois avoir compris ou le problème ce situe
aprés avoir cliquer sur le bouton "Noir et Blanc" des données seront affecté à la variable "bm" mais pour une raison que j'ignore quand je clique sur le bouton "Enregistrer les modifications", la variable "bm" est considéré comme une variable vide
alors c'est impossible d'enregistrer un variable vide
Commenter la réponse de NHenry
cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - 22 sept. 2016 à 14:22
0
Merci
Bonjour

D'abord

r = CInt(img.VerticalResolution.ToString) 'resolution image


Pourquoi converting en string et faire un casting to Cint
VerticalResolution rend un single
aussi la méthode Bitmap.SetResolution a deux paramètres de type
single
pour ton bug
mets un point d'arret(F9) à la ligne
SaveImage(bm, Chemain.Text, ext, r)

lance ton prog verifie avec l'espion la valeur de bm
ou soi dans le code de la sub SaveImage ajoute un try catch
try
btmp.SetResolution(resolution, resolution)
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
kikou93 418 Messages postés mardi 4 février 2014Date d'inscription 24 septembre 2018 Dernière intervention - 22 sept. 2016 à 14:48
Bonjour cs_ShayW,
Merci pour ton aide

1er mot :
Pour ça
r = CInt(img.VerticalResolution.ToString) 'resolution image

il existé déjà dans le code originale (celui de cs_Le Pivert )
j'ai modifier dans
SaveImage(bm, Chemain.Text, ext, r)
, le r par
CInt(img.VerticalResolution.ToString)


2eme mot :
je n'ai pas vraiment compris ce que tu voulais dire (désolé je suis qu'un débutant) normalement F9 arrêt l’exécution du programme non?

3eme mot :

je ne sais pas où mettre le code :
try
btmp.SetResolution(resolution, resolution)
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention > kikou93 418 Messages postés mardi 4 février 2014Date d'inscription 24 septembre 2018 Dernière intervention - 22 sept. 2016 à 15:38
pour le 1
tu peux écrire
Dim r As Single
r = img.VerticalResolution 'resolution image
Public Sub SaveImage(ByVal btmp As Bitmap, ByRef cheminDestination As String, ByVal extension As String, ByVal resolution As single)


2 Aprends à te servir du debogger debugger
F9 point d'arret c.a.d le prog s'executera jusqu'au point d'arret
ensuite tu continues pas à pas touche f11
où mettre le point d'arret ? dans ton cas à la ligne de code qui cause
l'erreur
SaveImage(bm, Chemain.Text, ext, r)

quand l'execution va s'arreter et la ligne est marquée en jaune
avec la souris marque le parametre bm et clique le bouton droit de
la souris.Dans le menu qui va s'ouvrir choisir "ajouter un espion" ou
"add watch" et verifie la valeur de bm
vaut il Nothing ? si oui problème si non continue pas à pas (chez moi
c'est la touche F11) quand tu seras arrivé à la ligne
 Select Case extension
maarque avec la souris le btm de
btmp.SetResolution(resolution, resolution)
et verifie avec l'espion sa valeur

pour le 3
le try catch permet de saisir une exception
à la place de la ligne
 btmp.SetResolution(resolution, resolution) 'resolution origine

mets
try
btmp.SetResolution(resolution, resolution)
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
kikou93 418 Messages postés mardi 4 février 2014Date d'inscription 24 septembre 2018 Dernière intervention - 22 sept. 2016 à 17:35
Bonsoir cs_ShayW,
J'ai suivi tes indications pas par pas
la valeur de bm n'est pas Nothing mais {System.Drawing.Bitmap}
Commenter la réponse de cs_ShayW
cs_ShayW 3238 Messages postés jeudi 26 novembre 2009Date d'inscription 14 mars 2018 Dernière intervention - 23 sept. 2016 à 11:28
0
Merci
D'abord
Si tu ne l'as pas fait
Active "Option Explicit" et "Option Strict"
Clique dans le menu Projet sur Propriétés.
Sous l'onglet Compiler, dans la liste Option Explicit, sélectionne On
dans la liste Option Strict, sélectionnez On .
Ensuite
Problème de Design

Tu dis
mais il y'a un problème si je clique sur le bouton "Noir et Blanc" après sur le bouton "Version d'origine" rien ne change parce que la version noir et blanc deviendras la version d'origine

le problème tu l'as crée.je ne sais pas ce que ton projet doit
faire mais pourquoi appeler le SaveImage(bm, Chemain.Text, ext, r) dans le code du bouton noirblanc ?

Dans le code bouton origine il te manque New Single()

{1.00, 0.00, 0.00, 0, 0}
=>
New Single()  {1.00, 0.00, 0.00, 0, 0}


Pour ton erreur Essai de voir quand l'erreur survient
comme tu dis
après quelque essais,...

Fais toi un test plan c.a d tu écris ce que tu vas faire et ensuite tu
appliques le test
ex lance le prog ,clique sur bouton noir-blanc clique sur sepia
Commenter la réponse de cs_ShayW

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.