将Access数据库中存储的图片加载到程序VB.NET中

时间:2013-06-15 03:00:15

标签: vb.net

我有一个通过数据源与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程序?

3 个答案:

答案 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