Member 9377677 Ответов: 4

В GDI+ произошла общая ошибка. VB.NET при сохранении изображения из picturebox


пожалуйста, предоставьте мне решение для следующего кода, который показывает ошибку GDI+ на рис.save.
Public Class Form1<br />
    Dim open As OpenFileDialog<br />
    Dim i As String<br />
    Dim img As Image = Nothing<br />
    Dim pic As String<br />
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load<br />
    End Sub<br />
<br />
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click<br />
        open = New OpenFileDialog<br />
        open.Filter = "Image Files(*.jpg;*.jpeg;*.gif;*.bmp;*.png;*.tif)|*.jpg;*.gif;*.bmp;*.tif"<br />
        open.ShowDialog()<br />
        pic = open.FileName<br />
        Try<br />
            Dim fs As New System.IO.FileStream(pic, IO.FileMode.Open, IO.FileAccess.Read)<br />
            img = Image.FromStream(fs)<br />
            fs.Close()<br />
            fs.Dispose()<br />
            My.Computer.FileSystem.DeleteFile(pic)<br />
            emppic.Image = img<br />
        Catch ex As Exception<br />
            img = Nothing<br />
        End Try<br />
    End Sub<br />
<br />
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click<br />
        Dim img6 As Image<br />
        img6 = emppic.Image<br />
        Try<br />
            emppic.Image.Save("C:\C-tek\Images\Temp\1.jpg", System.Drawing.Imaging.ImageFormat.Jpeg)<br />
        Catch ex As Exception<br />
            MsgBox("File  Saving Error." + ex.ToString)<br />
        End Try<br />
    End Sub<br />
End Class

вами заранее

4 Ответов

Рейтинг:
35

OriginalGriff

Как я уже говорил вам в прошлый раз, когда вы опубликовали это: vb.net 2008 в GDI+произошла общая ошибка.[^] в документации очень четко говорится, что вы должны держать поток открытым в течение всего срока службы изображения.
Вы не.

Итак, у вас есть два варианта:
1) Держите поток открытым для жизни изображения.
2) скопируйте изображение в другое и избавьтесь от исходного потока и изображения, как только вы это сделаете.
Это очень просто:

Dim safeImage as New Bitmap(img)
Теперь вы можете закрыть и удалить исходный поток и изображение.

В будущем, пожалуйста, наберитесь немного терпения...


Member 9377677

спасибо Грифф

Member 9377677

как вы можете видеть из кода, я уже сделал это, добавив изображение из потока файлов в img. а затем присвоил значение img picture box. после этого я закрыл ручей. пожалуйста, скажите мне, нужно ли мне снова присваивать значение img новой переменной safeimage. заранее спасибо. В будущем я буду демонстративно сохранять терпение.

OriginalGriff

"Я уже сделал это, добавив изображение из потока файлов в img."
Нет, ты не знал.
После того как вы загрузили "img" с вашим изображением из потока, вам нужно создать новую *копию* изображения с помощью "New Bitmap(img)", а затем установить "emppic.Image" значение для этого вместо оригинального "img". Копия не связана с потоком или исходным изображением - это просто копия фактических данных изображения, поэтому исходный поток и изображение можно безопасно утилизировать, и Ваш более поздний вызов "Image.Save" будет работать нормально, потому что он работает с копией, а не с исходной версией потока.

Member 9377677

спасибо Грифф это решено

OriginalGriff

Всегда пожалуйста!

Рейтинг:
2

Member 10748748

У меня была та же проблема, я решил ее, создав путь, который я хочу сохранить, и предоставив правильный доступ.
С уважением.


Рейтинг:
2

Vani Movva

Я столкнулся с той же проблемой. В моем сценарии все работает нормально,но при сохранении изображения возникает исключение.проблема в том, что я сохраняю файл со специальным символом ( \ ), что неприемлемо. теперь он работает нормально после изменения имени файла.


Geeky Sharma

тогда как же дать путь без использования \/ ?

Рейтинг:
2

Member 13945214

Dim filesize As UInt32
Dim ms As New MemoryStream
pbBookImg1.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg)
Dim imgbyte() As Byte = ms.GetBuffer
filesize = ms.Length

Dim sql As String
Dim dt As String
dt = Format(Now, "yyyy-MM-dd")
Select Case btnSave.Tag
    Case "Add"
        sql = "Insert into tbl_bookmaster(bookID,title,isbn,pages,langID,edition,authID,pubID,pubYear,secID,description,totalCopies,bookImg,dtCreated,isDelete) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,0)"
        Call addBookID()
    Case "Update"
        sql = "Update tbl_bookmaster set bookID=?,title=?,isbn=?,pages=?,langID=?,edition=?,authID=?,pubID=?,pubYear=?,secID=?,description=?,totalCopies=?,bookImg=? where bookID='" & Trim(dgvBookMaster.Tag) & "'"
End Select

cmd = New Odbc.OdbcCommand(sql, con)
cmd.Parameters.AddWithValue("?", lblBookID.Text)
cmd.Parameters.AddWithValue("?", txtTitle.Text)
cmd.Parameters.AddWithValue("?", txtISBN.Text)
cmd.Parameters.AddWithValue("?", txtPages.Text)
cmd.Parameters.AddWithValue("?", cbxLang.SelectedValue)
cmd.Parameters.AddWithValue("?", txtEdition.Text)
cmd.Parameters.AddWithValue("?", cbxAuth.SelectedValue)
cmd.Parameters.AddWithValue("?", cbxPublisher.SelectedValue)
cmd.Parameters.AddWithValue("?", txtYrPublished.Text)
cmd.Parameters.AddWithValue("?", cbxSection.SelectedValue)
cmd.Parameters.AddWithValue("?", txtDescription.Text)
cmd.Parameters.AddWithValue("?", txtCopies.Text)
cmd.Parameters.AddWithValue("?", imgbyte)
cmd.Parameters.AddWithValue("?", dt)
cmd.ExecuteNonQuery()
Call cleaner(tpDetails)
Call dgvloader("Select bookID,title,isbn,edition,fullName,pubDesc,pubYear,secDesc from vw_bookmaster where isDelete=0", dgvBookMaster)
lblBookID.Text = ""
dgvBookMaster.Tag = ""
tcBooks.SelectedTab = tpMain
Call buttEnabler(pnlLside, False)
ms.Close()
ms.Dispose()

da.Dispose()


Nattawutxp

ААА очень хорошо