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

Résolu
kikou93 Messages postés 417 Date d'inscription mardi 4 février 2014 Statut Membre Dernière intervention 24 septembre 2018 - 20 sept. 2016 à 23:09
kikou93 Messages postés 417 Date d'inscription mardi 4 février 2014 Statut Membre Dernière intervention 24 septembre 2018 - 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

4 réponses

cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
Modifié par cs_Le Pivert le 23/09/2016 à 18:16
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
2
kikou93 Messages postés 417 Date d'inscription mardi 4 février 2014 Statut Membre Dernière intervention 24 septembre 2018 1
Modifié par kikou93 le 23/09/2016 à 19:26
Bonsoir cs_ShayW,
C'est vrais quand je relis ce que j'ai écrit plus haut ce n'ai pas bien expliqué, désolé
Pour ce projet on à besoin de :
5 bouton
une picturebox
une OpenFileDialog
tu copie le code suivant directement :
http://pasted.co/2b10c38d
ce que je veux :
quand je choisi une image avec OpenFileDialog, l'image s'affiche dans la pictureBox (c'est fait)
quand je clique sur le bouton "Inverser couleurs" les couleurs de l'image s'inverse
si je veux annuler cette action je clique sur le bouton "Rétablir"
Même chose pour les autres boutons (Noir et Blanc et Sépia)
jusqu'à la il y a aucun problème
après avoir fait mon choix finale je clique sur le bouton "Enregistrer", mais pas pour enregistrer l'image sous un autre nom (comme dans la source originale de cs_Le Pivert )
http://codes-sources.commentcamarche.net/source/100589-visionneuse-d-image#q=Visionneuse+image&cur=3&url=
je veux remplacer l'image originale (pour ça je supprime l'image et j'enregistré l'image modifier dans le même emplacement, avec les même dimensions, avec la même extension et avec le même nom

Merci
0
kikou93 Messages postés 417 Date d'inscription mardi 4 février 2014 Statut Membre Dernière intervention 24 septembre 2018 1
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
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137 > kikou93 Messages postés 417 Date d'inscription mardi 4 février 2014 Statut Membre Dernière intervention 24 septembre 2018
Modifié par cs_Le Pivert le 24/09/2016 à 08:32
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
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
Modifié par cs_Le Pivert le 24/09/2016 à 12:00
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
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137 > cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024
Modifié par cs_Le Pivert le 24/09/2016 à 15:11
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
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
20 sept. 2016 à 23:13
Quelle erreur ?
0
kikou93 Messages postés 417 Date d'inscription mardi 4 février 2014 Statut Membre Dernière intervention 24 septembre 2018 1
Modifié par kikou93 le 20/09/2016 à 23:29
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)
0
kikou93 Messages postés 417 Date d'inscription mardi 4 février 2014 Statut Membre Dernière intervention 24 septembre 2018 1 > kikou93 Messages postés 417 Date d'inscription mardi 4 février 2014 Statut Membre Dernière intervention 24 septembre 2018
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")
0
kikou93 Messages postés 417 Date d'inscription mardi 4 février 2014 Statut Membre Dernière intervention 24 septembre 2018 1 > kikou93 Messages postés 417 Date d'inscription mardi 4 février 2014 Statut Membre Dernière intervention 24 septembre 2018
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
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
22 sept. 2016 à 14:22
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
0
kikou93 Messages postés 417 Date d'inscription mardi 4 février 2014 Statut Membre Dernière intervention 24 septembre 2018 1
Modifié par kikou93 le 22/09/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
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57 > kikou93 Messages postés 417 Date d'inscription mardi 4 février 2014 Statut Membre Dernière intervention 24 septembre 2018
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
0
kikou93 Messages postés 417 Date d'inscription mardi 4 février 2014 Statut Membre Dernière intervention 24 septembre 2018 1
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}
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
23 sept. 2016 à 11:28
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
0
Rejoignez-nous