Vb.net 从URL检索图像维度

Vb.net 从URL检索图像维度,vb.net,image,url,Vb.net,Image,Url,我正在尝试从图像URL检索图像维度。 这怎么可能? 我做了大量的研究,还没有发现任何代码可以实现这一点,所有的信息都是从本地磁盘上的图像获取图像尺寸,这不是我想要的 有可能做到这一点吗?我认为这是不可能的。问题是……在从互联网上的某个URL、文件或图片检索任何信息之前,必须先下载这些信息。这就是为什么Windows有临时文件夹的原因。所有内容都存储在临时文件夹中,包括您刚刚浏览互联网的场景。因此,我的建议是做同样的事情,首先下载图片并保存在某个地方,然后检索您想要的信息,然后如果您不再需要它,您

我正在尝试从图像URL检索图像维度。 这怎么可能? 我做了大量的研究,还没有发现任何代码可以实现这一点,所有的信息都是从本地磁盘上的图像获取图像尺寸,这不是我想要的


有可能做到这一点吗?

我认为这是不可能的。问题是……在从互联网上的某个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文件一样,信息位于整个事件的特定字节中,但我从来不知道你可以部分地从整个事件中获取信息。非常感谢。