PICTUREBOX

cs_colby Messages postés 126 Date d'inscription mardi 10 mai 2005 Statut Membre Dernière intervention 14 novembre 2022 - Modifié le 14 mars 2018 à 14:47
cs_colby Messages postés 126 Date d'inscription mardi 10 mai 2005 Statut Membre Dernière intervention 14 novembre 2022 - 20 mars 2018 à 10:30
Bonsoir et soyez indulgent à l'égard des débutants.
J'ai une form avec un picturebox et une base access
avec une colonne Img1 prenant comme donnée Objet OLE.

Pour enregistrer l'image, j'ai fait:
Dim MS As New IO.MemoryStream() 
Me.PicureBx.Image.Save(MS, Me.PictureBx.Image.RawFormat)
Dim ArrImage() As Byte = MS.GetBuffer 
DTR("Img1") = ArrImage
'(DTR est le DataRow)

Pour afficher l'image enregistrée j'ai fait:

Dim arrPicture() As Byte = CType(CrT.Rows(RowN).Item("Img1"), Byte())
Dim MS As New MemoryStream(ArrPicture)
   With Me.PictureBx
      .Image = Image.FromStream(MS)
      .SizeMode = PictureBoxSizeMode.StretchImage
      .BorderStyle = BorderStyle.FixedSingle
   End With
MS.Close()
'(Ici Crt est le DataTable et Rown est un integer)

Jusque là cela se comporte bien.

le problème :
Après affichage, je décide de modifier un enregistrement en remplaçant
l'ancienne image afficheée lors de l'appel par une autre image.
Alors j'ai fais:
Me.PictureBx.Image = Nothing

et après avoir sélectionné une nouvelle image, j'ai fait:
Dim MS As New IO.MemoryStream() 
Me.PicureBx.Image.Save(MS, Me.PictureBx.Image.RawFormat)
Dim ArrImage() As Byte = MS.GetBuffer 
DTR("Img1") = ArrImage

La nouvelle image séléctionnée ne s'enregistre pas, et j'obtient comme résultat :

Une exception non gérée du type
'System.Runtime.InteropServices.ExternalException' s'est produite dans
System.Drawing.dll

Informations complémentaires : Une erreur générique s'est produite dans GDI+

--

9 réponses

vb95 Messages postés 3476 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 16 juin 2024 169
16 mars 2018 à 17:43
Bonjour
As-tu chargée la nouvelle image dans la PictureBox une fois l'image sélectionnée ?
0
Oui, c'est quand je remplace la première image chargée dans le picturebox par une autre et voudrais enregistré la nouvelle image que je reçois l'erreur. Merci
0
vb95 Messages postés 3476 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 16 juin 2024 169
17 mars 2018 à 15:28
bonjour
La Picturebox affiche-t-elle la nouvelle image chargée ?
A quelle ligne se produit l'erreur ?
0
Oui, la nouvelle image est correctement chargée. C'est lors de l'enregistrement de l'image dans la base que je reçois comme erreur:
Une exception non g?r?e du type
'System.Runtime.InteropServices.ExternalException' s'est produite dans
System.Drawing.dll

Informations compl?mentaires : Une erreur g?n?rique s'est produite dans GDI+
0
vb95 Messages postés 3476 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 16 juin 2024 169
18 mars 2018 à 13:18
A quelle ligne se produit l'erreur ?
0
Me.PicureBx.Image.Save(MS, Me.PictureBx.Image.RawFormat)
0
vb95 Messages postés 3476 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 16 juin 2024 169
18 mars 2018 à 22:59
bizarre !
Tu arrives à enregistrer l'image à l'origine !
Tu la modifiés dans la Picturebox et avec le même code elle ne s'enregistre pas !
0

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

Posez votre question
Oui, et a chaque fois a la ligne ou l'image est sauvée au format Raw, une exception est levée.
J'ai essayé de supprimer la ligue complète dans la base et de procéder a l'enregistrement d'une nouvelle ligne, idem.
Comment faire?
0
vb95 Messages postés 3476 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 16 juin 2024 169
Modifié le 19 mars 2018 à 03:02
Alors là je n'en sais rien !
Désolé
0
Merci quand même pour l'écoute.
0
Whismeril Messages postés 19067 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 22 juin 2024 657
19 mars 2018 à 08:17
Bonjour
Au départ comment as tu enregistré l’image dans la base?
0
cs_colby Messages postés 126 Date d'inscription mardi 10 mai 2005 Statut Membre Dernière intervention 14 novembre 2022
19 mars 2018 à 08:39
Type byte, après qu'il soit sauvé au format raw.
Dim MS As New IO.MemoryStream()
Me.PicureBx.Image.Save(MS, Me.PictureBx.Image.RawFormat)
Dim ArrImage() As Byte = MS.GetBuffer
DTR("Img1") = ArrImage
0
Whismeril Messages postés 19067 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 22 juin 2024 657
19 mars 2018 à 09:41
Ok, donc dans les 2 cas tu utilises bien le même code.
Et comment tu modifies l’image?

Ps utilise la coloration syntaxique quand tu postes un code
http://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code
0
cs_colby Messages postés 126 Date d'inscription mardi 10 mai 2005 Statut Membre Dernière intervention 14 novembre 2022
19 mars 2018 à 14:56
A l'aide d'un bout de code trouvé sur vbfrance. Je clic sur le picturebox qui me conduit a mes images j'en choisi une et elle s'affiche. Jai limité le choix a .jpg et a .bmp

--
0
vb95 Messages postés 3476 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 16 juin 2024 169
19 mars 2018 à 15:39
bonjour !
Cela fait 13 ans que tu es inscrit sur le site et il ne te vient pas à l'idée de poster le bout de code que tu utilises !
0
Whismeril Messages postés 19067 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 22 juin 2024 657
19 mars 2018 à 16:37
A l'aide d'un bout de code trouvé sur vbfrance

Je rejoins vb95, s’il n’y avait que 10 codes sur le site, un jour ou je suis motivé, je tacherai peut-être de trouver par moi-même, mais y’en a des millers ....
0
cs_colby Messages postés 126 Date d'inscription mardi 10 mai 2005 Statut Membre Dernière intervention 14 novembre 2022 > vb95 Messages postés 3476 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 16 juin 2024
20 mars 2018 à 00:26
Veuillez m'excuser pour mon comportement. Surtout Whismerill.
Je reprends:
J'ai une form avec un picturebox et une base access
avec une colonne Img1 prenant comme donnée Objet OLE.

Pour charger l'image dans le picturebox j'ai fait :

 Private Sub Pic1_Click(sender As Object, e As EventArgs) Handles Pic1.Click
On Error Resume Next
Dim OpenFileDialog As New OpenFileDialog
OpenFileDialog.InitialDirectory = My.Computer.FileSystem.SpecialDirectories.MyPictures
OpenFileDialog.Filter = "All Files|*.*|Bitmaps|*.bmp|JPEGs|*.jpg"
If (OpenFileDialog.ShowDialog(Me) = System.Windows.Forms.DialogResult.OK) Then
Dim File As String
For Each File In OpenFileDialog.FileNames
Dim TestFile As System.IO.FileInfo = New System.IO.FileInfo(File)
If Not String.Compare(TestFile.Extension, ".bmp", True) = 0 _
And Not String.Compare(TestFile.Extension, ".jpg", True) = 0 Then
MessageBox.Show("Fichier non supporté. Sélectionner un fichier BMP ou JPG." & vbCrLf & _
" Essayer de nouveau.", "Auto")
Return
End If
With Me.Pic1
.Image = Image.FromFile(OpenFileDialog.FileName)
.SizeMode = PictureBoxSizeMode.StretchImage
.BorderStyle = BorderStyle.FixedSingle
End With
Next
End If
End Sub


Pour enregistrer l'image, j'ai fait:

Dim MS As New IO.MemoryStream() 
Me.PicureBx.Image.Save(MS, Me.PictureBx.Image.RawFormat)
Dim ArrImage() As Byte = MS.GetBuffer
DTR("Img1") = ArrImage
'(DTR est le DataRow)



Pour afficher l'image enregistrée j'ai fait:

Dim arrPicture() As Byte = CType(CrT.Rows(RowN).Item("Img1"), Byte())
Dim MS As New MemoryStream(ArrPicture)
With Me.PictureBx
.Image = Image.FromStream(MS)
.SizeMode = PictureBoxSizeMode.StretchImage
.BorderStyle = BorderStyle.FixedSingle
End With
MS.Close()

'(Ici Crt est le DataTable, Rown est un integer, Img1 la colonne image dans la table)


le problème :
Après affichage, je décide changer l'image du picturebox par une autre.
Alors j'ai fais:

Me.PictureBx.Image = Nothing


et après je sélectionne une nouvelle image, en cliquant dans le picturebox comme la permière fois. Après j'ai refait:

Dim MS As New IO.MemoryStream() 
Me.PicureBx.Image.Save(MS, Me.PictureBx.Image.RawFormat)
Dim ArrImage() As Byte = MS.GetBuffer
DTR("Img1") = ArrImage



Maintenant j'ai fait un update dans la base.

 Public Sub ValiderMiseAJour()
Try
Connection()
Sql = "SELECT ID, Cost, Img1 FROM Cars WHERE [ID] LIKE '" & Trim$(Me.TIndex.Text) & "'"
Cmd = New OleDb.OleDbCommand(Sql)
CrTA = New OleDb.OleDbDataAdapter(Cmd)
Cmd.Connection() = GP
CDSet = New DataSet
CrTA.Fill(CDSet, "Cars")
Dim Ligne As Integer = CDSet.Tables.Count - 1
With CDSet
DTR = CDSet.Tables("Cars").Rows(Ligne)

Dim MS1 As New IO.MemoryStream()
Me.Pic1.Image.Save(MS1, Me.Pic1.Image.RawFormat)
Dim ArrImage1() As Byte = MS1.GetBuffer
DTR("Img1") = ArrImage1

CmdB = New OleDb.OleDbCommandBuilder(CrTA) CrTA.UpdateCommand = CmdB.GetUpdateCommand
CrTA.Update(CDSet, "Cars") : CDSet.Clear()
MS1.Dispose()
MS1.Close()
End With
Catch ex As Exception
Finally
GP.Close()
End Try
End Sub


La nouvelle image séléctionnée ne s'enregistre pas, et j'obtient comme résultat :

Une exception non gérée du type
'System.Runtime.InteropServices.ExternalException' s'est produite dans
System.Drawing.dll

Informations complémentaires : Une erreur générique s'est produite dans GDI+

a la ligne

Me.Pic1.Image.Save(MS1, Me.Pic1.Image.RawFormat)


du update

Merci d'avance
0
vb95 Messages postés 3476 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 16 juin 2024 169
Modifié le 20 mars 2018 à 02:04
Salut

Tu écris : "Maintenant j'ai fait un update dans la base."

Dans la Sub ValiderMiseAJour()
                Dim MS1 As New IO.MemoryStream() 
                Me.Pic1.Image.Save(MS1, Me.Pic1.Image.RawFormat)
                Dim ArrImage1() As Byte = MS1.GetBuffer 
                DTR("Img1") = ArrImage1


Pourquoi Me.Pict1 et nom Me.PicureBx ?

A part cela
1 ) Mélange de VB 6 et de VB Net :
On Error Resume Next
c'est du VB 6 ! Surtout que tu utilises
Try Catch
ailleurs qui gère les erreurs en VB Net
2)
Not String.Compare(TestFile.Extension, ".bmp", True) = 0 
: il y a une méthode plus VB Net pour avoir l'extension
System.Io.Path.GetExtension(fileName)

3) Supprimer dans les références du projet la référence Microsoft.visualBasic : ceci évite de mélanger du VB 6 avec du VB Net
4) Dans l'onglet Compiler mettre Option Strict et Option Explicit sur True : ceci oblige de déclarer toutes les variables et d'éviter les erreurs de type de variable

5) et pour finir : un bon cours sur VB Net : http://plasserre.developpez.com/cours/vb-net/
0
vb95 Messages postés 3476 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 16 juin 2024 169 > cs_colby Messages postés 126 Date d'inscription mardi 10 mai 2005 Statut Membre Dernière intervention 14 novembre 2022
20 mars 2018 à 01:59
Et aussi
J'aurais aussi accepté tes excuses !
Mais je vois que je n'y a pas droit !
0
Mes excuses svp, je discute avec vous depuis mon mobile. Je tacherai de ne plus répondre si je ne suis pas devant mon ordi. Une fois encore mes excuses. Suis toujours débutant puisque je codes par plaisir et pour aider de temps en temps.
0
Rejoignez-nous