Этот код позволяет использовать стандартный элемент управления WebBrowser для перехода на страницу поиска Google Image и выбора / загрузки изображения с помощью щелчка правой кнопкой мыши.
Чтобы проверить это, перетащите элемент управления WebBrowser и FlowLayoutPanel на форму и перейдите на страницу поиска изображений Google.
Что нужно знать:
Обратите внимание, что обработчик событий подключается по завершении текущего документа и удаляется при переходе браузера на другую страницу.Это предотвращает нежелательные звонки на событие DocumentCompleted
.
Когда текущий Документ завершен, щелчок правой кнопкой мыши на изображении создает новый элемент управления PictureBox, который добавляется в FlowLayouPanel для презентации.
Код в обработчике щелчка мыши (Protected Sub OnHtmlDocumentClick()
) определяет, является ли текущее изображение строкой Base64Encoded
или внешним источником URI
.
В первом случае он вызывает Convert.FromBase64String для преобразования строки в массив байтов, во втором случае используется WebClient
класс для загрузки изображения в виде байтового массива.
В обоих случаях массив затем передается другому методу (Private Function GetBitmapFromByteArray()
), который возвращает изображение из массива, используя Image.FromStream()
и MemoryStream
инициализируется с помощью байтового массива.
Код здесь не выполняет нулевые проверки и подобные тесты на отказоустойчивость.Это должно, это зависит от вас.
Public Class frmBrowser
Private WebBrowserDocumentEventSet As Boolean = False
Private base64Pattern As String = "base64,"
Private Sub frmBrowser_Load(sender As Object, e As EventArgs) Handles MyBase.Load
WebBrowser1.ScriptErrorsSuppressed = True
WebBrowser1.IsWebBrowserContextMenuEnabled = False
End Sub
Private Sub WebBrowser1_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
If WebBrowser1.ReadyState = WebBrowserReadyState.Complete AndAlso WebBrowserDocumentEventSet = False Then
WebBrowserDocumentEventSet = True
AddHandler WebBrowser1.Document.MouseDown, AddressOf OnHtmlDocumentClick
End If
End Sub
Protected Sub OnHtmlDocumentClick(sender As Object, e As HtmlElementEventArgs)
Dim currentImage As Image = Nothing
If Not (e.MouseButtonsPressed = MouseButtons.Right) Then Return
Dim source As String = WebBrowser1.Document.GetElementFromPoint(e.ClientMousePosition).GetAttribute("src")
If source.Contains(base64Pattern) Then
Dim base64 As String = source.Substring(source.IndexOf(base64Pattern) + base64Pattern.Length)
currentImage = GetBitmapFromByteArray(Convert.FromBase64String(base64))
Else
Using wc As WebClient = New WebClient()
currentImage = GetBitmapFromByteArray(wc.DownloadData(source))
End Using
End If
Dim p As PictureBox = New PictureBox() With {
.Image = currentImage,
.Height = Math.Min(FlowLayoutPanel1.ClientRectangle.Height, FlowLayoutPanel1.ClientRectangle.Width)
.Width = .Height,
.SizeMode = PictureBoxSizeMode.Zoom
}
FlowLayoutPanel1.Controls.Add(p)
End Sub
Private Sub WebBrowser1_Navigating(sender As Object, e As WebBrowserNavigatingEventArgs) Handles WebBrowser1.Navigating
If WebBrowser1.Document IsNot Nothing Then
RemoveHandler WebBrowser1.Document.MouseDown, AddressOf OnHtmlDocumentClick
WebBrowserDocumentEventSet = False
End If
End Sub
Private Function GetBitmapFromByteArray(imageBytes As Byte()) As Image
Using ms As MemoryStream = New MemoryStream(imageBytes)
Return DirectCast(Image.FromStream(ms).Clone(), Image)
End Using
End Function
End Class