У меня есть база данных Access, содержащая карты для карточной игры с их изображением. Один из столбцов в моей базе данных содержит URL изображений этих карточек.
Однако я изо всех сил пытаюсь показать изображение из URL-адреса в PictureBox.
Я попытался загрузить его с помощью класса HttpClient, но получил слишком много ошибок, поэтому вот код, в котором ошибок нет, но он все равно не работает:
' adds an image to a PictureBox
PictureBox1.Image = Image.FromFile(dataSet.Tables("YGO cards").Rows(0).Item(8))
Это вызывает ошибку:
Object reference not set to an instance of an object.
Знаете ли вы способ отображения изображений с использованием URL-адреса?
Существуют тысячи карточек с разными URL-адресами.
Вот два из них:
https://storage.googleapis.com/ygoprodeck.com/pics/27551.jpg
https://storage.googleapis.com/ygoprodeck.com/pics/41777.jpg
Вы можете использовать метод Вебклиент. 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
Я предлагаю зарегистрировать имя файла растрового изображения в базе данных; только имя файла, а не полный путь: расположение изображений должно быть определено, когда приложение загружает изображения в первый раз, и может измениться (или пользователь может изменить его по какой-либо причине). Если вам нужно переместить изображения, вам просто нужно обновить путь к хранилищу.
Эта информация также может храниться в базе данных.
Добавьте логическое поле [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() для загрузки данных изображения в виде массива байтов и создания нового растрового изображения из 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()
Добавьте столбец в свою базу данных для загрузки, чтобы ваша программа знала, где искать изображение (в локальном хранилище или в Интернете). Веб-сайт требует, чтобы вы загружали изображение только один раз, а затем сохраняли его локально.
Ну, я рад, что это было полезно :)