使用 Access 数据库中的 URL 在 PictureBox 中显示图像

Posted

技术标签:

【中文标题】使用 Access 数据库中的 URL 在 PictureBox 中显示图像【英文标题】:Show an Image in a PictureBox using the URL from an Access database 【发布时间】:2019-04-06 00:42:27 【问题描述】:

我有一个 Access 数据库,其中包含用于纸牌游戏的纸牌及其图片。我数据库中的一列包含这些卡片图片的网址。 但是,我正在努力在 PictureBox 中显示来自 URL 的图像。

我尝试使用 HttpClient 类下载它,但我收到了太多错误,所以这里是没有任何错误但仍然无法工作的代码:

' adds an image to a PictureBox
PictureBox1.Image = Image.FromFile(dataSet.Tables("YGO cards").Rows(0).Item(8)) 

这会产生一个错误:

对象引用未设置为对象的实例。

您知道使用 URL 显示图像的方法吗? 有数千张具有不同 URL 的卡片。

这里有两个例子:https://storage.googleapis.com/ygoprodeck.com/pics/27551.jpghttps://storage.googleapis.com/ygoprodeck.com/pics/41777.jpg

【问题讨论】:

【参考方案1】:

您可以使用WebClient.DownloadFileTaskAsync 方法下载位图文件(如果您需要存储这些文件并最终只下载位图的更新),然后从文件中加载图像: (要使用这种异步方法,您的代码需要包含在 async 方法/事件处理程序中)

Dim imageURL As String = "https://storage.googleapis.com/ygoprodeck.com/pics/27551.jpg"
Dim imageURI As Uri = New Uri(imageURL)
Dim bitmapFile As String = Path.Combine(Application.StartupPath, $"images\imageURI.Segments.Last()")

Using client As WebClient = New WebClient()
    Await client.DownloadFileTaskAsync(imageURI, bitmapFile)
    PictureBox1.Image?.Dispose()
    PictureBox1.Load(bitmapFile)
End Using

我的建议是在数据库中注册Bitmap的文件名;仅文件名,而不是完整路径:应在应用程序第一次下载图像时确定图像的位置,并且可能会更改(或者用户可能出于任何原因更改它)。如果需要重新定位镜像,只需更新存储路径即可。 该信息也可以存储在数据库中。

添加一个布尔字段[Downloaded],以在下载图像后设置为True(以过滤还没有关联位图的记录)。


如果您不想或无法下载位图,可以使用PictureBox.LoadAsync 方法(或同步PictureBox.Load 方法)让控件为您完成工作:

Dim imageURL As String  = "https://storage.googleapis.com/ygoprodeck.com/pics/27551.jpg"
PictureBox1.Image?.Dispose()    
PictureBox1.LoadAsync(imageURL)

或者使用WebClient.DownloadDataTaskAsync()方法将图片数据下载为Byte数组,从MemoryStream生成新的Bitmap。位图不会保存在光盘上:

Dim imageURL As String = "https://storage.googleapis.com/ygoprodeck.com/pics/27551.jpg"
Dim client As WebClient = New WebClient()
Dim ms As MemoryStream = New MemoryStream(
    Await client.DownloadDataTaskAsync(New Uri(imageURL))
)

Using image As Image = Image.FromStream(ms)
    PictureBox1.Image?.Dispose()
    PictureBox1.Image = DirectCast(image.Clone(), Image)
End Using

ms.Dispose()
client.Dispose()

【讨论】:

好吧,我很高兴它有帮助:) 在您的数据库中添加一列以供下载,以便您的程序知道在哪里查找图片(区域设置存储或网络)该网站只希望您下载一次图像,然后将其存储在本地。

以上是关于使用 Access 数据库中的 URL 在 PictureBox 中显示图像的主要内容,如果未能解决你的问题,请参考以下文章

如何让这个程序使用 instagram pic url 并下载? [复制]

如何将字符串 pic URL 转换为图像并显示在图像标签中。?

从 Java 调用 Access 中的 VBA 函数

php获取URL参数

JDBC连接数据库驱动及URL对应表

模拟微信讨论组的头像集合