kikou93
Messages postés417Date d'inscriptionmardi 4 février 2014StatutMembreDernière intervention24 septembre 2018
-
20 sept. 2016 à 23:09
kikou93
Messages postés417Date d'inscriptionmardi 4 février 2014StatutMembreDernière intervention24 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 :
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
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
kikou93
Messages postés417Date d'inscriptionmardi 4 février 2014StatutMembreDernière intervention24 septembre 20181 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
Messages postés7904Date d'inscriptionjeudi 13 septembre 2007StatutContributeurDernière intervention14 août 2024137
>
kikou93
Messages postés417Date d'inscriptionmardi 4 février 2014StatutMembreDernière intervention24 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
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
cs_Le Pivert
Messages postés7904Date d'inscriptionjeudi 13 septembre 2007StatutContributeurDernière intervention14 août 2024137
>
cs_Le Pivert
Messages postés7904Date d'inscriptionjeudi 13 septembre 2007StatutContributeurDernière intervention14 août 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
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
Messages postés417Date d'inscriptionmardi 4 février 2014StatutMembreDernière intervention24 septembre 20181
>
kikou93
Messages postés417Date d'inscriptionmardi 4 février 2014StatutMembreDernière intervention24 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")
kikou93
Messages postés417Date d'inscriptionmardi 4 février 2014StatutMembreDernière intervention24 septembre 20181
>
kikou93
Messages postés417Date d'inscriptionmardi 4 février 2014StatutMembreDernière intervention24 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
cs_ShayW
Messages postés3253Date d'inscriptionjeudi 26 novembre 2009StatutMembreDernière intervention 3 décembre 201957 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
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
Messages postés3253Date d'inscriptionjeudi 26 novembre 2009StatutMembreDernière intervention 3 décembre 201957
>
kikou93
Messages postés417Date d'inscriptionmardi 4 février 2014StatutMembreDernière intervention24 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
kikou93
Messages postés417Date d'inscriptionmardi 4 février 2014StatutMembreDernière intervention24 septembre 20181 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}
cs_ShayW
Messages postés3253Date d'inscriptionjeudi 26 novembre 2009StatutMembreDernière intervention 3 décembre 201957 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
Modifié par kikou93 le 23/09/2016 à 19:26
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
23 sept. 2016 à 19:25
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
Modifié par cs_Le Pivert le 24/09/2016 à 08:32
https://openclassrooms.com/forum/sujet/vb-net-changer-l-image-d-un-picturebox-53646
Voici le code que j'ai fait pour tester:
il va falloir que tu corriges le mode d'ouverture de ton image. Je te laisse le faire
Bon courage
@+ Le Pivert
Modifié par cs_Le Pivert le 24/09/2016 à 12:00
http://codes-sources.commentcamarche.net/forum/affich-1640387-vb-2008-une-erreur-generique-s-est-produite-dans-gdi#11
Modifié par cs_Le Pivert le 24/09/2016 à 15:11
faire de même pour le ton sépia
Bonne programmation
@+ Le Pivert