vb中利用picturebox或imagebox显示网络图片的问题

如图例:http://pic46.nipic.com/20140823/610812_165246132527_2.jpg
请问:
1、是否用picturebox或imagebox加载网络图片,只能使用URLDownloadToFile先把网络图片下载到本地,再使用loadpicture来加载图片?
2、如果这样的话,会不会比使用WebBrowser1.Navigate 来显示图片要慢呢?
3、如果慢的话,有什么办法,既能像WebBrowser1.Navigate 来显现图片那样快,又能使显示的效果想在imagebox或picturebox里那样?(因为WebBrowser1.Navigate 显示图片,会有边框,还会有滚动条,而且刷新时还会显示一下网页的代码,而且当图片链接有问题时,还会出现无法加载网页,总之webbrowser不能像图片框一样显得那么合适),能否两者兼得呢》?

第1个回答  2014-09-13
下面是在VB中显示网页图片的三种方法,其中第一种方法就是完全适合你的要求的:

第一种方法:如果知道图片的URL,那么可以直接在Picture1中显示:

Private Declare Function OleLoadPicturePath Lib "oleaut32.dll" (ByVal szURLorPath As Long, ByVal punkCaller As Long, ByVal dwReserved As Long, ByVal clrReserved As OLE_COLOR, ByRef riid As TGUID, ByRef ppvRet As IPicture) As Long

Private Type TGUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(0 To 7) As Byte
End Type

Public Function LoadPicture(ByVal strFileName As String) As Picture
Dim IID As TGUID
With IID
.Data1 = &H7BF80980
.Data2 = &HBF32
.Data3 = &H101A
.Data4(0) = &H8B
.Data4(1) = &HBB
.Data4(2) = &H0
.Data4(3) = &HAA
.Data4(4) = &H0
.Data4(5) = &H30
.Data4(6) = &HC
.Data4(7) = &HAB
End With
On Error GoTo LocalErr
OleLoadPicturePath StrPtr(strFileName), 0&, 0&, 0&, IID, LoadPicture
Exit Function
LocalErr:
Set LoadPicture = VB.LoadPicture(strFileName)
Err.Clear
End Function

Private Sub Command1_Click()
Picture1.Picture = LoadPicture("http://www.baidu.com/img/bdlogo.gif")
End Sub

第二种方法:如果知道图片的URL,那么可以先把图片下载到本地,再在Picture1中显示:

Private Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long

Private Sub Command1_Click()
URLDownloadToFile 0&, "http://www.baidu.com/img/bdlogo.gif", App.Path & "\bdlogo.gif", 0&, 0&
Picture1.Picture = LoadPicture(App.Path & "\bdlogo.gif")
End Sub

第三种方法:如果不知道图片URL,但知道网页的URL,那么可以用WebBrowser控件显示网页,再从中找到需要的图片显示到Picture1中:

Private Sub Command1_Click()
Dim CtrlRange As Object, img As Object
Set CtrlRange = WebBrowser1.Document.body.createControlRange
For Each img In WebBrowser1.Document.images
If InStr(img.src, "bdlogo") Then
CtrlRange.Add img
CtrlRange.execCommand "Copy"
Picture1.Picture = Clipboard.GetData
Exit For
End If
Next
End Sub

Private Sub Form_Load()
WebBrowser1.Navigate "http://www.baidu.com"
End Sub

以上方法都可以显示百度首页的那个Logo图片。相比而言,第一种方法是最好的,别看它代码最多,但它是完全用代码实现的,没有借助其他控件,也没有产生中间文件,用起来就好像网上的图片就是自己硬盘中的图片一样;第二种方法代码最简单,但它会产生硬盘文件,不过如果你恰巧需要下载文件的(就是说不但要显示,还想利用这个图片做其他操作),那么这个方法就是最佳选择了;第三种方法最复杂,需要用到网页控件,而且要用剪贴板过渡,不过如果你的软件本来就是需要用到网页控件的,或者你想获得同一网页的多张图片,那么这又是不二选择了。

补充说明:用URLDownloadToFile显示图片并不会比WebBrowser1.Navigate慢,可能还会更快一些,因为WebBrowser1也是把图片下载了再显示的,只不过它是把图片下载到IE的缓存区,第二次再运行的时候它就会直接到IE缓存区调用了,这个时候就是WebBrowser1快些。另外,WebBrowser1中的边框和滚动条都是可以去掉的,按照网页的处理方法就行了(网页都可以做到无边框无滚动条,WebBrowser1自然也可以)。本回答被提问者和网友采纳
相似回答