kenchidag Ответов: 2

Изображение, используемое в VB.NET


Всем привет! У меня есть эта проблема после открытия изображения с помощью метода диалога открытия файла и обновления изображения внутри базы данных. После обновления я пытаюсь переместить изображение, которое я загрузил в базу данных, но кажется, что это вызывает ошибку "процесс не может быть завершен, потому что файл используется другой программой", и поэтому я должен закрыть приложение vb, чтобы я мог переместить файл в папку, и это немного раздражает, чтобы открыть и закрыть приложение. Есть ли способ переместить файл после использования и не закрывать приложение vb?

вот код, который я использую... большое спасибо :)

Try

            Dim dlgimage As FileDialog = New OpenFileDialog()
            dlgimage.Filter = "Image File (*.jpg)|*.jpg"

            If dlgimage.ShowDialog() = DialogResult.OK Then
                imgName = dlgimage.FileName

                Dim newimg As New Bitmap(imgName)

                P1picbox.SizeMode = PictureBoxSizeMode.StretchImage
                P1picbox.Image = DirectCast(newimg, Image)
            Else
                Exit Sub
            End If
            dlgimage = Nothing
        Catch ex As Exception
            MsgBox(ex.ToString())
        End Try


Что я уже пробовал:

Я пробовал гуглить, но, похоже, он просто показывает, как открыть файл с помощью диалога open file,,, но то, что я пытаюсь сделать, это освободить ресурсы от использования приложением после того, как я загрузил его в базу данных.. Я хочу переместить его в другую папку, не закрывая приложение.

2 Ответов

Рейтинг:
12

OriginalGriff

Когда вы открываете файл изображения с помощью конструктора Bitmap, файл остается открытым в течение всего времени существования изображения , то есть до тех пор, пока не будет удален фактический экземпляр класса Image. Если вы посмотрите на документацию, то это довольно ясно: Конструктор Растровых Изображений (String) (System.Рисование)[^]

The file remains locked until the Bitmap is disposed.

Это означает, что вы не можете писать в файл, перемещать файл, переименовывать файл или удалять файл до тех пор, пока изображение не будет закончено.
Есть способы обойти это: прочитать файл как массив байтов с помощью File.ReadAllBytes, затем создайте поток памяти из байтов и создайте из него образ:
Dim bytes As Byte() = File.ReadAllBytes("D:\Temp\MyImage.bmp")
Dim ms As New MemoryStream(bytes)
Dim useThisImage As Image = Image.FromStream(ms)


kenchidag

Привет, OriginalGriff, спасибо за ваш ответ. Я попробую поставить этот код. И возвращайся, если это сработает...: D

kenchidag

УР-да-человек OriginalGriff,, все работает спасибо.. аплодисменты!

OriginalGriff

:румянец:
Пожалуйста!

Рейтинг:
11

Richard MacCutchan

Проблема в том, какой ресурс вы держите в себе newimg это растровое изображение, созданное из файла. См. раздел Примечания по адресу Конструктор Растровых Изображений (String) (System.Рисование)[^].