Как преобразовать двоичные данные в изображение и отобразить их в картинке? - PullRequest
1 голос
/ 09 июня 2019

У меня есть изображение в файле доступа, и я хочу получить и отобразить его в другой форме Windows Forms, используя идентификатор пользователя.

Код для сохранения изображения:

 Dim img = PictureBox1. Image

 Dim ms As New System.IO.MemoryStream
 img.Save(ms, img.RawFormat)
 img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg)
 bytImage = ms.ToArray()
 ms.Close()

Код для получения изображения:

 con.ConnectionString = dbProvider & dbSource

 con.Open()
 Dim userIdPro = Transfer.userIdPro
 Dim query = ("SELECT Image FROM User_info WHERE ID = " & userIdPro & ";")

 Dim ds As New DataSet

 Dim dr As OleDb.OleDbDataReader
 Dim cm = New OleDb.OleDbCommand(query, con)
 dr = cm.ExecuteReader
 While dr.Read()
     Dim MyByte = dr.Item("Value")
     Dim fs = New MemoryStream
     fs.Write(MyByte, 0, MyByte.Length)
     fs.Flush()
     Dim MyImg = Image.FromStream(fs, True)
     MyImg.Save(dr.Item("ID").ToString & ".JPG", System.Drawing.Imaging.ImageFormat.Jpeg)
        PictureBox1.Image = MyImg
        fs.Close()
        fs = Nothing
     End While
     con.Close()
End Sub

Я не могу перенести двоичные данные в dr; это всегда пусто.

1 Ответ

0 голосов
/ 09 июня 2019

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

 con.ConnectionString = dbProvider & dbSource

 con.Open()
 Dim userIdPro = Transfer.userIdPro

 // Don't concatenate your parameters. This is a bad practice and
 // exposes your application to SQL injection attacks. Use SQL
 // parameters instead.

 Dim query = ("SELECT Image FROM User_info WHERE ID = " & userIdPro & ";")

 Dim ds As New DataSet

 Dim dr As OleDb.OleDbDataReader
 Dim cm = New OleDb.OleDbCommand(query, con)
 dr = cm.ExecuteReader
 While dr.Read()

     Dim MyByte = dr.Item("Value")
     Dim MyImg As Image

     If MyByte IsNot Nothing Then
        // You do not need to save it, just convert to an image
        // type and set it to your PictureBox1 control.

        MyImg = bytesToImage(MyByte)
        PictureBox1.Image = MyImg
     End If
End While
con.Close()

Ваш класс должен иметь свойство Image как Byte()

<Table("User_info")>
Public Class User

   Public Property Photo As Byte()

End Class

Использование следующих функций:

Public Function imageToBytes(ByVal imageIn As System.Drawing.Image) As Byte()
    Dim ms As MemoryStream = New MemoryStream()
    imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg)
    Return ms.ToArray()
End Function

Public Function bytesToImage(ByVal byteArrayIn As Byte()) As Image
    Dim ms As MemoryStream = New MemoryStream(byteArrayIn)
    Dim returnImage As Image = Image.FromStream(ms)
    Return returnImage
End Function

Чтобы сохранить изображение в базе данных:

Public Sub SaveImage()
    Using context = New ProjectDb()
        Dim user = New User() With {
            .Id = Guid.NewGuid,
            .Photo = imageToBytes(PictureBox1.Image)
        }
        context.Users.Add(user)
        context.SaveChanges()
    End Using
End Sub

Чтобы извлечь изображение из базы данных:

Public Function GetImage(ByVal id As Guid) As Image
    Using context = New ProjectDb()

        Dim image As Image

        Dim user As User = context.Users.FirstOrDefault(Function(x) x.Id = id)

        If user IsNot Nothing Then
            image = bytesToImage(user.Photo)
            PictureBox2.Image = image
        End If

    End Using
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...