0

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

4

3 回答 3

1

仍然显示错误:索引和长度必须引用字符串中的位置。参数名称:len

于 2021-02-16T12:38:13.660 回答
0

Access 表中实际上没有存储“图像”之类的东西,只有二进制流。因此,您的表情的左侧并不知道右侧正在提供图像。您必须将二进制流流式传输到 VB.NET 中的流中,然后使用 System.Graphics 方法将其转换为 BMP 或 PNG 或其他格式。您可以将该对象分配给按钮。

于 2013-06-15T04:11:43.983 回答
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
于 2014-05-06T10:29:00.263 回答