Asp classic 如何使用服务器端vbscript获取图像宽度?Asp经典

Asp classic 如何使用服务器端vbscript获取图像宽度?Asp经典,asp-classic,vbscript,Asp Classic,Vbscript,几天来,我一直在寻找一种方法来获取驻留在服务器上的.png文件的图像宽度。我试图读取文件的前24个字节,并从字节17-20解析出宽度。我在网上找到了好几个程序,但都没有成功。奇怪的是,我似乎得到了从十六进制到十进制解码的字节21-24的高度。我已经验证了文件内容使用十六进制查看器和文件是好的。以下是例行程序的主要部分: Function ReadPNG(fichero) Dim fso, ts, s, HW, nbytes HW = Array("0", "0") Set fso

几天来,我一直在寻找一种方法来获取驻留在服务器上的.png文件的图像宽度。我试图读取文件的前24个字节,并从字节17-20解析出宽度。我在网上找到了好几个程序,但都没有成功。奇怪的是,我似乎得到了从十六进制到十进制解码的字节21-24的高度。我已经验证了文件内容使用十六进制查看器和文件是好的。以下是例行程序的主要部分:

Function ReadPNG(fichero)
Dim fso, ts, s, HW, nbytes
    HW = Array("0", "0")
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set ts = fso.OpenTextFile(Server.MapPath("\forums\attachments/" & fichero), 1)
    s = Right(ts.Read(24), 8)
    HW(0) = HexToDec(HexAt(s,3) & HexAt(s,4))
    HW(1) = HexToDec(HexAt(s,7) & HexAt(s,8))
    ts.Close
    ReadPNG = HW
End Function

Function HexAt(s, n)
    HexAt = Hex(AscAt(s, n))
End Function

Function HexToDec(ByVal HexVal)

Dim i, num, part
num = 0
For I = 1 to Len(HexVal)
    part = Mid(StrReverse(UCase(HexVal)), I, 1)
    If IsNumeric(part) Then
        num = num + (CInt(part) * 16 ^ (I - 1) )
    Else
        num = num + ( (Asc(part) - 55) * 16^(I - 1) )
    End If
Next

HexToDec = num

End Function
例如,我的文件的宽度字节中有十六进制“00 00 01 80”(十进制384) 和十六进制“00 00 01 32”的高度字节(十进制306)

我得到的是高度306,但宽度返回“0011”(十进制17)

我完全被绊倒了!我也不必使用这个例程

谢谢,
Jim

这是我刚才看到的一篇帖子,看起来它可能会简化一些事情。我还没有测试,所以让我知道你的结果

<%
dim iWidth, iheight
sub ImgDimension(img)
dim myImg, fs
Set fs= CreateObject("Scripting.FileSystemObject")
if not fs.fileExists(img) then exit sub
set myImg = loadpicture(img)
iWidth = round(myImg.width / 26.4583)
iheight = round(myImg.height / 26.4583)
set myImg = nothing
end sub

ImgDimension(Server.MapPath("server image file"))
%> 

请参见此处查看帖子:


更新:看到此方法在64位中不起作用。这里是另一个可选方法的链接:

这里是我多年前发现的一组用于获取图像信息的通用函数。我会把我一直使用的方式放在最后

':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
':::                                                             :::'
':::  This routine will attempt to identify any filespec passed  :::'
':::  as a graphic file (regardless of the extension). This will :::'
':::  work with BMP, GIF, JPG and PNG files.                     :::'
':::                                                             :::'
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
':::          Based on ideas presented by David Crowell          :::'
':::                   (credit where due)                        :::'
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
'::: blah blah blah blah blah blah blah blah blah blah blah blah :::'
'::: blah blah blah blah blah blah blah blah blah blah blah blah :::'
'::: blah blah     Copyright *c* MM,  Mike Shaffer     blah blah :::'
'::: blah blah      ALL RIGHTS RESERVED WORLDWIDE      blah blah :::'
'::: blah blah  Permission is granted to use this code blah blah :::'
'::: blah blah   in your projects, as long as this     blah blah :::'
'::: blah blah      copyright notice is included       blah blah :::'
'::: blah blah blah blah blah blah blah blah blah blah blah blah :::'
'::: blah blah blah blah blah blah blah blah blah blah blah blah :::'
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'

':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
':::                                                             :::'
':::  This function gets a specified number of bytes from any    :::'
':::  file, starting at the offset (base 1)                      :::'
':::                                                             :::'
':::  Passed:                                                    :::'
':::       flnm        => Filespec of file to read               :::'
':::       offset      => Offset at which to start reading       :::'
':::       bytes       => How many bytes to read                 :::'
':::                                                             :::'
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
function GetBytes(flnm, offset, bytes)

 Dim objFSO
 Dim objFTemp
 Dim objTextStream
 Dim lngSize

 on error resume next

 Set objFSO = CreateObject("Scripting.FileSystemObject")

 ' First, we get the filesize'
 Set objFTemp = objFSO.GetFile(flnm)
 lngSize = objFTemp.Size
 set objFTemp = nothing

 fsoForReading = 1
 Set objTextStream = objFSO.OpenTextFile(flnm, fsoForReading)

 if offset > 0 then
    strBuff = objTextStream.Read(offset - 1)
 end if

 if bytes = -1 then        ' Get All!'

    GetBytes = objTextStream.Read(lngSize)  'ReadAll'

 else

    GetBytes = objTextStream.Read(bytes)

 end if

 objTextStream.Close
 set objTextStream = nothing
 set objFSO = nothing

end function


':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
':::                                                             :::'
':::  Functions to convert two bytes to a numeric value (long)   :::'
':::  (both little-endian and big-endian)                        :::'
':::                                                             :::'
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
function lngConvert(strTemp)
 lngConvert = clng(asc(left(strTemp, 1)) + ((asc(right(strTemp, 1)) * 256)))
end function

function lngConvert2(strTemp)
 lngConvert2 = clng(asc(right(strTemp, 1)) + ((asc(left(strTemp, 1)) * 256)))
end function


':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
':::                                                             :::'
':::  This function does most of the real work. It will attempt  :::'
':::  to read any file, regardless of the extension, and will    :::'
':::  identify if it is a graphical image.                       :::'
':::                                                             :::'
':::  Passed:                                                    :::'
':::       flnm        => Filespec of file to read               :::'
':::       width       => width of image                         :::'
':::       height      => height of image                        :::'
':::       depth       => color depth (in number of colors)      :::'
':::       strImageType=> type of image (e.g. GIF, BMP, etc.)    :::'
':::                                                             :::'
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
function gfxSpex(flnm, width, height, depth, strImageType)

 dim strPNG 
 dim strGIF
 dim strBMP
 dim strType
 strType = ""
 strImageType = "(unknown)"

 gfxSpex = False

 strPNG = chr(137) & chr(80) & chr(78)
 strGIF = "GIF"
 strBMP = chr(66) & chr(77)

 strType = GetBytes(flnm, 0, 3)

 if strType = strGIF then                ' is GIF'

    strImageType = "GIF"
    Width = lngConvert(GetBytes(flnm, 7, 2))
    Height = lngConvert(GetBytes(flnm, 9, 2))
    Depth = 2 ^ ((asc(GetBytes(flnm, 11, 1)) and 7) + 1)
    gfxSpex = True

 elseif left(strType, 2) = strBMP then        ' is BMP'

    strImageType = "BMP"
    Width = lngConvert(GetBytes(flnm, 19, 2))
    Height = lngConvert(GetBytes(flnm, 23, 2))
    Depth = 2 ^ (asc(GetBytes(flnm, 29, 1)))
    gfxSpex = True

 elseif strType = strPNG then            ' Is PNG'

    strImageType = "PNG"
    Width = lngConvert2(GetBytes(flnm, 19, 2))
    Height = lngConvert2(GetBytes(flnm, 23, 2))
    Depth = getBytes(flnm, 25, 2)

    select case asc(right(Depth,1))
       case 0
          Depth = 2 ^ (asc(left(Depth, 1)))
          gfxSpex = True
       case 2
          Depth = 2 ^ (asc(left(Depth, 1)) * 3)
          gfxSpex = True
       case 3
          Depth = 2 ^ (asc(left(Depth, 1)))  '8'
          gfxSpex = True
       case 4
          Depth = 2 ^ (asc(left(Depth, 1)) * 2)
          gfxSpex = True
       case 6
          Depth = 2 ^ (asc(left(Depth, 1)) * 4)
          gfxSpex = True
       case else
          Depth = -1
    end select


 else

    strBuff = GetBytes(flnm, 0, -1)        ' Get all bytes from file'
    lngSize = len(strBuff)
    flgFound = 0

    strTarget = chr(255) & chr(216) & chr(255)
    flgFound = instr(strBuff, strTarget)

    if flgFound = 0 then
       exit function
    end if

    strImageType = "JPG"
    lngPos = flgFound + 2
    ExitLoop = false

    do while ExitLoop = False and lngPos < lngSize

       do while asc(mid(strBuff, lngPos, 1)) = 255 and lngPos < lngSize
          lngPos = lngPos + 1
       loop

       if asc(mid(strBuff, lngPos, 1)) < 192 or asc(mid(strBuff, lngPos, 1)) > 195 then
          lngMarkerSize = lngConvert2(mid(strBuff, lngPos + 1, 2))
          lngPos = lngPos + lngMarkerSize  + 1
       else
          ExitLoop = True
       end if

   loop

   if ExitLoop = False then

      Width = -1
      Height = -1
      Depth = -1

   else

      Height = lngConvert2(mid(strBuff, lngPos + 4, 2))
      Width = lngConvert2(mid(strBuff, lngPos + 6, 2))
      Depth = 2 ^ (asc(mid(strBuff, lngPos + 8, 1)) * 8)
      gfxSpex = True

   end if

 end if

end function
”:
':::                                                             :::'
“:::此例程将尝试标识传递的任何文件规范::”
'::作为图形文件(不考虑扩展名)。这将::'
':::使用BMP、GIF、JPG和PNG文件。:'
':::                                                             :::'
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
“:::基于大卫·克劳威尔提出的想法:”
“:(到期时贷记):”
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
’:::废话废话废话废话废话废话废话:废话
’:::废话废话废话废话废话废话废话:废话
’:::诸如此类版权所有*c*MM,迈克·沙弗诸如此类::'
’:::诸如此类,版权所有。诸如此类::'
“:::诸如此类的权限被授予使用此代码诸如此类的:::”
’:::在你的项目中胡说八道,只要这个胡说八道::'
“:::诸如此类的版权声明包括在内诸如此类的::”
’:::废话废话废话废话废话废话废话:废话
’:::废话废话废话废话废话废话废话:废话
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
':::                                                             :::'
“:::此函数从任何::”中获取指定数量的字节
“:::文件,从偏移量开始(基1):”
':::                                                             :::'
“:::已通过::”
':::flnm=>Filespec要读取的文件::'
“:::offset=>开始读取的偏移量::”
“:::bytes=>要读取的字节数::”
':::                                                             :::'
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
函数GetBytes(flnm、偏移量、字节)
Dim objFSO
模糊对象
暗淡的objTextStream
模糊lngSize
出错时继续下一步
设置objFSO=CreateObject(“Scripting.FileSystemObject”)
'首先,我们获得文件大小'
设置objFTemp=objFSO.GetFile(flnm)
lngSize=objFTemp.Size
设置objFTemp=nothing
fsoForReading=1
设置objTextStream=objFSO.OpenTextFile(flnm、fsoForReading)
如果偏移量>0,则
strBuff=objTextStream.Read(偏移量-1)
如果结束
如果字节=-1,则“全部获取!”
GetBytes=objTextStream.Read(lngSize)'ReadAll'
其他的
GetBytes=objTextStream.Read(字节)
如果结束
objTextStream,关闭
设置objTextStream=nothing
设置objFSO=nothing
端函数
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
':::                                                             :::'
“:::函数,用于将两个字节转换为数值(长):”
“::(小端和大端):”
':::                                                             :::'
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
功能lngConvert(strTemp)
lngConvert=clng(asc(左(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(
端函数
功能lngConvert2(strTemp)
lngConvert2=clng(asc(右(右(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右)(右
端函数
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
':::                                                             :::'
'::此函数完成大部分实际工作。它将尝试::'
“:::读取任何文件,无论其扩展名为何,并将::”
':::标识它是否是图形图像。:'
':::                                                             :::'
“:::已通过::”
':::flnm=>Filespec要读取的文件::'
“:::width=>图像的宽度::”
“:::height=>图像的高度::”
“:::depth=>颜色深度(以颜色数表示):”
“:::strImageType=>图像类型(例如GIF、BMP等):”
':::                                                             :::'
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'
函数gfxSpex(flnm
'collect the image information into an array'
Dim blnGfxSpex, width, height, colors, strType
intCount = 0
For Each objFile In objFS.GetFolder(".\images").Files
    If LCase(Right(objFile.Name, 4)) = ".jpg" and intCount <= intNumOfFiles Then
        blnGfxSpex = gfxSpex((".\images\" & objFile.Name), width, height, colors, strType)

        arrImages(intCount) = "<image>" & vbNewLine & _
                                "<filename>" & objFile.Name & "</filename>" & vbNewLine & _
                                "<caption></caption>" & vbNewLine & _
                                "<width>" & width & "</width>" & vbNewLine & _
                                "<height>" & height & "</height>" & vbNewLine & _
                                "</image>" & vbNewLine
        intCount = intCount + 1
    End If
Next
   Function ImgDim(img)
    Dim objFSO, objGF, objLP, imgWdt, imgHgt, imgSiz
    img = Server.MapPath("/pictures/"& img) 'path to picture
    Set objFSO= CreateObject("Scripting.FileSystemObject")
    If objFSO.fileExists(img) Then
     Set objGF = objFSO.GetFile(img)
      imgSiz = objGF.Size
     Set objGF = Nothing
     Set objLP = loadpicture(img)
      imgWdt = round(objLP.width / 26.4583)
      imgHgt = round(objLP.height / 26.4583)
     Set objLP = Nothing
     Set fs = Nothing
     ImgDim = imgWdt &"x"& imgHgt &" - "& imgSiz/1024 &"KBytes"
    End If
   End Function