我有一个通过数据源与VB项目链接的Access数据库。在其中一个表的数据库中,我有一个OLE对象字段。我已在此字段中以.BMP格式和.JPG格式保存图片。我遇到的问题是将此图像加载到我的应用程序中。这是我希望能够做到的:
ButtonMeal1.BackgroundImage = IPOSDBDataSet.Meals.Rows(0).Item(5)
其中Item(5)是存储图像的行的列。
还有另一种方法吗?我是否必须将图片作为变量存储到程序中,然后使用它来更改按钮的背景图像。关于我的问题,互联网上没有明确的答案。请帮忙!
编辑1: 在做了一些更多的研究之后,我找到了一些代码并对其进行了调整以尝试修复我的问题。
Dim ImageByteArray As Byte() = CType(IPOSDBDataSet.Meals.Rows(0).Item(5), Byte())
Dim ImageMemoryStream As MemoryStream = New IO.MemoryStream(ImageByteArray)
Dim MyImage As Image = Drawing.Image.FromStream(ImageMemoryStream)
PictureBox1.Image = MyImage
但是,我收到代码第3行的错误“参数无效”。有人能告诉我如何调整我的代码来解决这个问题,或者告诉我我是否做了一些完全错误的事情?
编辑2: 我一直在改变代码,但错误始终是“参数无效”。什么参数无效?
编辑3: 无论我改变什么,错误仍然存在。导致我所有问题的这个参数是什么?
Dim ImageByteArray As Byte() = CType(IPOSDBDataSet.Meals.Rows(0).Item(5), Byte())
Dim ImageMemoryStream As MemoryStream = New IO.MemoryStream(ImageByteArray)
Dim ImageStream As Stream = ImageMemoryStream
Dim MyImage As Image = Drawing.Image.FromStream(ImageStream)
PictureBox1.Image = MyImage
编辑4: 有人可以帮忙吗?我真的需要能够将它实现到我的程序中。有没有其他可能的方法在访问数据库中存储图像,并将它们导入我的vb.net程序?
答案 0 :(得分:1)
仍然显示错误:索引和长度必须引用字符串中的某个位置。参数名称:len
答案 1 :(得分:0)
存在于Access表中的“图像”实际上并不存在,只有二进制流。因此,表达式的左侧不知道右侧正在提供图像。您必须在VB.NET中将二进制流流式传输到流中,然后使用System.Graphics方法将其转换为BMP或PNG或其他任何内容。您可以将该对象分配给按钮。
答案 2 :(得分:0)
来自CodeProject的TnTinMan可获得答案。希望这有助于其他人:
Dim ImageByteArray As Byte() = CType(DataSet.Table.Rows(RowNo).Item(ItemNo), Byte())
Dim ImageMemoryStream As MemoryStream = New IO.MemoryStream(GetImageBytesFromOLEField(ImageByteArray))
Dim MyImage As Image = Drawing.Image.FromStream(ImageMemoryStream)
Friend Shared Function GetImageBytesFromOLEField(ByVal oleFieldBytes() As Byte) As Byte()
Dim BITMAP_ID_BLOCK As String = "BM"
Dim JPG_ID_BLOCK As String = ChrW(&HFF).ToString() & ChrW(&HD8).ToString() & ChrW(&HFF).ToString()
Dim PNG_ID_BLOCK As String = ChrW(&H89).ToString() & "PNG" & vbCrLf & ChrW(&H1A).ToString() & vbLf
Dim GIF_ID_BLOCK As String = "GIF8"
Dim TIFF_ID_BLOCK As String = "II*" & ChrW(&H0).ToString()
Dim imageBytes() As Byte
' Get a UTF7 Encoded string version
Dim u7 As System.Text.Encoding = System.Text.Encoding.UTF7
Dim strTemp As String = u7.GetString(oleFieldBytes)
Dim st2 As String = System.Text.Encoding.UTF8.GetString(oleFieldBytes)
' Get the first 300 characters from the string
Dim strVTemp As String = strTemp.Substring(0, 300)
' Search for the block
Dim iPos As Integer = -1
If strVTemp.IndexOf(BITMAP_ID_BLOCK) <> -1 Then
iPos = strVTemp.IndexOf(BITMAP_ID_BLOCK)
ElseIf strVTemp.IndexOf(JPG_ID_BLOCK) <> -1 Then
iPos = strVTemp.IndexOf(JPG_ID_BLOCK)
ElseIf strVTemp.IndexOf(PNG_ID_BLOCK) <> -1 Then
iPos = strVTemp.IndexOf(PNG_ID_BLOCK)
ElseIf strVTemp.IndexOf(GIF_ID_BLOCK) <> -1 Then
iPos = strVTemp.IndexOf(GIF_ID_BLOCK)
ElseIf strVTemp.IndexOf(TIFF_ID_BLOCK) <> -1 Then
iPos = strVTemp.IndexOf(TIFF_ID_BLOCK)
Else
Throw New Exception("Unable to determine header size for the OLE Object")
End If
' From the position above get the new image
If iPos = -1 Then
Throw New Exception("Unable to determine header size for the OLE Object")
End If
imageBytes = New Byte(CInt(oleFieldBytes.LongLength - iPos - 1)) {}
Array.ConstrainedCopy(oleFieldBytes, iPos, imageBytes, 0, oleFieldBytes.Length - iPos)
Return imageBytes
End Function