<p>利用FSO取得BMP,JPG,PNG,GIF文件信息.</p>
<p><%<br />
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<br />
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<br />
'::: BMP, GIF, JPG and PNG :::<br />
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<br />
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<br />
'::: :::<br />
'::: This function gets a specified number of bytes from any :::<br />
'::: file, starting at the offset (base 1) :::<br />
'::: :::<br />
'::: Passed: :::<br />
'::: flnm => Filespec of file to read :::<br />
'::: offset => Offset at which to start reading :::<br />
'::: bytes => How many bytes to read :::<br />
'::: :::<br />
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<br />
function GetBytes(flnm, offset, bytes)<br />
Dim objFSO<br />
Dim objFTemp<br />
Dim objTextStream<br />
Dim lngSize<br />
on error resume next<br />
Set objFSO = CreateObject("Scripting.FileSystemObject")<br />
' First, we get the filesize<br />
Set objFTemp = objFSO.GetFile(flnm)<br />
lngSize = objFTemp.Size<br />
set objFTemp = nothing<br />
fsoForReading = 1<br />
Set objTextStream = objFSO.OpenTextFile(flnm, fsoForReading)<br />
if offset > 0 then<br />
strBuff = objTextStream.Read(offset - 1)<br />
end if<br />
if bytes = -1 then ' Get All!<br />
GetBytes = objTextStream.Read(lngSize) 'ReadAll<br />
else<br />
GetBytes = objTextStream.Read(bytes)<br />
end if<br />
objTextStream.Close<br />
set objTextStream = nothing<br />
set objFSO = nothing<br />
end function<br />
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<br />
'::: :::<br />
'::: Functions to convert two bytes to a numeric value (long) :::<br />
'::: (both little-endian and big-endian) :::<br />
'::: :::<br />
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<br />
function lngConvert(strTemp)<br />
lngConvert = clng(asc(left(strTemp, 1)) + ((asc(right(strTemp, 1)) * 256)))<br />
end function<br />
function lngConvert2(strTemp)<br />
lngConvert2 = clng(asc(right(strTemp, 1)) + ((asc(left(strTemp, 1)) * 256)))<br />
end function<br />
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<br />
'::: :::<br />
'::: This function does most of the real work. It will attempt :::<br />
'::: to read any file, regardless of the extension, and will :::<br />
'::: identify if it is a graphical image. :::<br />
'::: :::<br />
'::: Passed: :::<br />
'::: flnm => Filespec of file to read :::<br />
'::: width => width of image :::<br />
'::: height => height of image :::<br />
'::: depth => color depth (in number of colors) :::<br />
'::: strImageType=> type of image (e.g. GIF, BMP, etc.) :::<br />
'::: :::<br />
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<br />
function gfxSpex(flnm, width, height, depth, strImageType)<br />
dim strPNG <br />
dim strGIF<br />
dim strBMP<br />
dim strType<br />
strType = ""<br />
strImageType = "(unknown)"<br />
gfxSpex = False<br />
strPNG = chr(137) & chr(80) & chr(78)<br />
strGIF = "GIF"<br />
strBMP = chr(66) & chr(77)<br />
strType = GetBytes(flnm, 0, 3)<br />
if strType = strGIF then ' is GIF<br />
strImageType = "GIF"<br />
Width = lngConvert(GetBytes(flnm, 7, 2))<br />
Height = lngConvert(GetBytes(flnm, 9, 2))<br />
Depth = 2 ^ ((asc(GetBytes(flnm, 11, 1)) and 7) + 1)<br />
gfxSpex = True<br />
elseif left(strType, 2) = strBMP then ' is BMP<br />
strImageType = "BMP"<br />
Width = lngConvert(GetBytes(flnm, 19, 2))<br />
Height = lngConvert(GetBytes(flnm, 23, 2))<br />
Depth = 2 ^ (asc(GetBytes(flnm, 29, 1)))<br />
gfxSpex = True<br />
elseif strType = strPNG then ' Is PNG<br />
strImageType = "PNG"<br />
Width = lngConvert2(GetBytes(flnm, 19, 2))<br />
Height = lngConvert2(GetBytes(flnm, 23, 2))<br />
Depth = getBytes(flnm, 25, 2)<br />
select case asc(right(Depth,1))<br />
case 0<br />
Depth = 2 ^ (asc(left(Depth, 1)))<br />
gfxSpex = True<br />
case 2<br />
Depth = 2 ^ (asc(left(Depth, 1)) * 3)<br />
gfxSpex = True<br />
case 3<br />
Depth = 2 ^ (asc(left(Depth, 1))) '8<br />
gfxSpex = True<br />
case 4<br />
Depth = 2 ^ (asc(left(Depth, 1)) * 2)<br />
gfxSpex = True<br />
case 6<br />
Depth = 2 ^ (asc(left(Depth, 1)) * 4)<br />
gfxSpex = True<br />
case else<br />
Depth = -1<br />
end select<br />
else<br />
strBuff = GetBytes(flnm, 0, -1) ' Get all bytes from file<br />
lngSize = len(strBuff)<br />
flgFound = 0<br />
strTarget = chr(255) & chr(216) & chr(255)<br />
flgFound = instr(strBuff, strTarget)<br />
if flgFound = 0 then<br />
exit function<br />
end if<br />
strImageType = "JPG"<br />
lngPos = flgFound + 2<br />
ExitLoop = false<br />
do while ExitLoop = False and lngPos < lngSize<br />
do while asc(mid(strBuff, lngPos, 1)) = 255 and lngPos < lngSize<br />
lngPos = lngPos + 1<br />
loop<br />
if asc(mid(strBuff, lngPos, 1)) < 192 or asc(mid(strBuff, lngPos, 1)) > 195 then<br />
lngMarkerSize = lngConvert2(mid(strBuff, lngPos + 1, 2))<br />
lngPos = lngPos + lngMarkerSize + 1<br />
else<br />
ExitLoop = True<br />
end if<br />
loop<br />
'<br />
if ExitLoop = False then<br />
Width = -1<br />
Height = -1<br />
Depth = -1<br />
else<br />
Height = lngConvert2(mid(strBuff, lngPos + 4, 2))<br />
Width = lngConvert2(mid(strBuff, lngPos + 6, 2))<br />
Depth = 2 ^ (asc(mid(strBuff, lngPos + 8, 1)) * 8)<br />
gfxSpex = True<br />
end if<br />
end if<br />
end function<br />
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<br />
'::: Test Harness :::<br />
':::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::<br />
' To test, we'll just try to show all files with a .GIF extension in the root of C:<br />
Set objFSO = CreateObject("Scripting.FileSystemObject")<br />
Set objF = objFSO.GetFolder("c:\")<br />
Set objFC = objF.Files<br />
response.write "<table border=""0"" cellpadding=""5"">"<br />
For Each f1 in objFC<br />
if instr(ucase(f1.Name), ".GIF") then<br />
response.write "<tr><td>" & f1.name & "</td><td>" & f1.DateCreated & "</td><td>" & f1.Size & "</td><td>"<br />
if gfxSpex(f1.Path, w, h, c, strType) = true then<br />
response.write w & " x " & h & " " & c & " colors"<br />
else<br />
response.write " "<br />
end if<br />
response.write "</td></tr>"<br />
end if<br />
Next<br />
response.write "</table>"<br />
set objFC = nothing<br />
set objF = nothing<br />
set objFSO = nothing<br />
%><br />
</p>