Vb.net 从URL检索图像维度
我正在尝试从图像URL检索图像维度。 这怎么可能? 我做了大量的研究,还没有发现任何代码可以实现这一点,所有的信息都是从本地磁盘上的图像获取图像尺寸,这不是我想要的Vb.net 从URL检索图像维度,vb.net,image,url,Vb.net,Image,Url,我正在尝试从图像URL检索图像维度。 这怎么可能? 我做了大量的研究,还没有发现任何代码可以实现这一点,所有的信息都是从本地磁盘上的图像获取图像尺寸,这不是我想要的 有可能做到这一点吗?我认为这是不可能的。问题是……在从互联网上的某个URL、文件或图片检索任何信息之前,必须先下载这些信息。这就是为什么Windows有临时文件夹的原因。所有内容都存储在临时文件夹中,包括您刚刚浏览互联网的场景。因此,我的建议是做同样的事情,首先下载图片并保存在某个地方,然后检索您想要的信息,然后如果您不再需要它,您
有可能做到这一点吗?我认为这是不可能的。问题是……在从互联网上的某个URL、文件或图片检索任何信息之前,必须先下载这些信息。这就是为什么Windows有临时文件夹的原因。所有内容都存储在临时文件夹中,包括您刚刚浏览互联网的场景。因此,我的建议是做同样的事情,首先下载图片并保存在某个地方,然后检索您想要的信息,然后如果您不再需要它,您可以在以后删除该文件。您不需要下载整个文件,只需下载前几个字节。如果图像为PNG,则宽度为第17、18、19和20字节,高度为第21、22、23和24字节。如果是
GIF
,则宽度在第7和第8字节,高度在第9和第10字节。这对于JPG
来说很复杂。请注意,PNG中的字节顺序是大端(255
-000000FF
),而GIF中的字节顺序是小端(255
-FF00
)。以下是代码:
Imports System
Imports System.Net
Imports System.IO
Imports System.Text
Imports System.Threading
Imports Microsoft.VisualBasic
Public Class Form1
Private Sub GetImageDimensions() Handles Button1.Click
HTTPWebRequest_GetResponse.Main("http://www.example.com/image.png") 'without slash at end
Do
If HTTPWebRequest_GetResponse.done = True Then
Dim width As Integer = HTTPWebRequest_GetResponse.width
Dim height As Integer = HTTPWebRequest_GetResponse.height
Exit Do
End If
If HTTPWebRequest_GetResponse.exception Then
Exit Do 'prevents inifinite loop if exception occured
End If
Loop
End Sub
End Class
Public Class RequestState
' This class stores the State of the request.
Public requestData As StringBuilder
Public BufferRead() As Byte
Public request As HttpWebRequest
Public response As HttpWebResponse
Public streamResponse As Stream
Public Sub New()
requestData = New StringBuilder("")
request = Nothing
streamResponse = Nothing
End Sub 'New
End Class 'RequestState
Class HTTPWebRequest_GetResponse
Private BUFFER_SIZE As Integer = 1024
Public Shared response As String
Public Shared done As Boolean = False
Public Shared length As Long = 1
Public Shared progress As Integer
Public Shared myHttpWebRequest As HttpWebRequest
Public Shared myRequestState As New RequestState
Public Shared status As String
Private Shared body As Boolean = False
Public Shared responseStream As Stream
Private Shared offset As Integer
Private Shared bytestoread As Integer
Public Shared width As Integer
Public Shared height As Integer
Private Shared imageType As String
Public Shared exception As Boolean = False
Shared Sub Main(url As String)
done = False
exception = False
Try
If url.Substring(url.Length - 4) = ".png" Then
myRequestState.BufferRead = New Byte(23) {}
offset = 16
bytestoread = 24
imageType = "png"
ElseIf url.Substring(url.Length - 4) = ".gif" Then
myRequestState.BufferRead = New Byte(9) {}
offset = 6
bytestoread = 10
imageType = "gif"
Else
Throw New NotSupportedException("You can only use this with PNG or GIF images.")
End If
' Create a HttpWebrequest object to the desired URL.
myHttpWebRequest = WebRequest.Create(url)
' Create an instance of the RequestState and assign the previous myHttpWebRequest
' object to its request field.
myRequestState.request = myHttpWebRequest
' Start the asynchronous request.
Dim result As IAsyncResult = CType(myHttpWebRequest.BeginGetResponse(New AsyncCallback(AddressOf RespCallback), myRequestState), IAsyncResult)
Catch e As WebException
exception = True
Debug.WriteLine(ControlChars.Lf + "Main Exception raised!")
Debug.WriteLine(ControlChars.Lf + "Message: " + e.Message)
Debug.WriteLine(ControlChars.Lf + "Status: " + e.Status)
Catch e As Exception
exception = True
Debug.WriteLine(ControlChars.Lf + "Main Exception raised!")
Debug.WriteLine("Source : " + e.Source)
Debug.WriteLine("Message : " + e.Message)
End Try
End Sub 'Main
Private Shared Sub RespCallback(asynchronousResult As IAsyncResult)
Try
Dim myHttpWebRequest As HttpWebRequest = myRequestState.request
myRequestState.response = CType(myHttpWebRequest.EndGetResponse(asynchronousResult), HttpWebResponse)
' Read the response into a Stream object.
Dim responseStream As Stream = myRequestState.response.GetResponseStream()
myRequestState.streamResponse = responseStream
' Begin the Reading of the contents of the HTML page.
responseStream.Read(myRequestState.BufferRead, 0, bytestoread)
If BitConverter.IsLittleEndian Then
If imageType = "png" Then
height = BitConverter.ToInt32(myRequestState.BufferRead.Skip(offset).Reverse.Take(4).ToArray, 0)
width = BitConverter.ToInt32(myRequestState.BufferRead.Skip(offset).Reverse.Skip(4).Take(4).ToArray, 0)
Else
width = BitConverter.ToInt16(myRequestState.BufferRead.Skip(offset).Skip(6).Take(2).ToArray, 0)
height = BitConverter.ToInt16(myRequestState.BufferRead.Skip(offset).Skip(8).Take(2).ToArray, 0)
End If
Else
If imageType = "png" Then
width = BitConverter.ToInt32(myRequestState.BufferRead.Skip(offset).Skip(16).Take(4).ToArray, 0)
height = BitConverter.ToInt32(myRequestState.BufferRead.Skip(offset).Skip(20).Take(4).ToArray, 0)
Else
height = BitConverter.ToInt16(myRequestState.BufferRead.Skip(offset).Reverse.Take(2).ToArray, 0)
width = BitConverter.ToInt16(myRequestState.BufferRead.Skip(offset).Reverse.Skip(2).Take(2).ToArray, 0)
End If
End If
done = True
Return
Catch e As WebException
exception = True
Debug.WriteLine(ControlChars.Lf + "RespCallback Exception raised!")
Debug.WriteLine(ControlChars.Lf + "Message: " + e.Message)
Debug.WriteLine(ControlChars.Lf + "Status: " + e.Status)
Catch ex As Exception
exception = True
Debug.WriteLine(ControlChars.Lf + "RespCallback Exception raised!")
Debug.WriteLine(ex.ToString)
End Try
End Sub 'RespCallback
End Class
代码很大,但我认为这只是为了下载足够的字节
资料来源:
问题是我必须过滤数百张图像。所以下载500张图片要花很长时间,然后对它们进行过滤,最终在花10分钟下载500张图片之后,我可能会剩下20张图片。所以这很费时。我以前做过类似的事情。这是一项SEO工作,如果我手动搜索关键词、图片和其他内容,需要一个多月的时间才能完成。有一次我不得不处理23000个链接。所以我决定创建一个机器人程序来完成这项工作。大约花了3个小时才完成扫描。我不知道是否有更好的方法,但根据我读过的无数教程,这是唯一的方法。如果有人有更好的想法,我会非常感激,如果它能被分享,这样我就可以学习:)还有一件事……你不能让你的程序在几秒钟内扫描数百张图片,除非你有一台超级计算机。毕竟,对我来说,3个小时比1个月好得多。你以前听说过溪流吗?@neolik,是的,先生,我听说过溪流。事实上,我制作了一款android应用程序,可以在线直播视频。不幸的是,我从来没有用VB.NET做过任何关于流媒体图片的事情。如果你对此有任何想法,你可以分享,这样我们都可以向你学习。谢谢:)嘿,这太棒了!看起来正是我想要的,你能提供代码/示例吗?如果您愿意,请更新您的答案,我相信它可以帮助其他人。@user3102516代码已添加!我被纠正了。感谢您提供这些信息@srka。我知道,就像mp3文件一样,信息位于整个事件的特定字节中,但我从来不知道你可以部分地从整个事件中获取信息。非常感谢。