通过Adodb.Stream取得图像(BMP JPG PNG GIF SWF)的高度和宽度

ado|stream

上传图片或显示SWF的时候都希望得到它的高度和宽度

基本原理使用Adodb.Stream读二进制文件然后进行解析,然后返回一数组
第一个元素为类型(BMP JPG PNG GIF SWF)
第二个元素为宽度{width}
第三个元素为高度{height}
第四个元素为width={width},height={height}式字符串

Class qswhImg
dim aso
Private Sub Class_Initialize
set aso=CreateObject("Adodb.Stream")
aso.Mode=3
aso.Type=1
aso.Open
End Sub
Private Sub Class_Terminate
set aso=nothing
End Sub

Private Function Bin2Str(Bin)
Dim I, Str
For I=1 to LenB(Bin)
clow=MidB(Bin,I,1)
if ASCB(clow)<128 then
Str = Str & Chr(ASCB(clow))
else
I=I+1
if I <= LenB(Bin) then Str = Str & Chr(ASCW(MidB(Bin,I,1)&clow))
end if
Next
Bin2Str = Str
End Function

Private Function Num2Str(num,base,lens)
'qiushuiwuhen (2002-8-12)
dim ret
ret = ""
while(num>=base)
ret = (num mod base) & ret
num = (num - num mod base)/base
wend
Num2Str = right(string(lens,"0") & num & ret,lens)
End Function

Private Function Str2Num(str,base)
'qiushuiwuhen (2002-8-12)
dim ret
ret = 0
for i=1 to len(str)
ret = ret *base + cint(mid(str,i,1))
next
Str2Num=ret
End Function

Private Function BinVal(bin)
'qiushuiwuhen (2002-8-12)
dim ret
ret = 0
for i = lenb(bin) to 1 step -1
ret = ret *256 + ascb(midb(bin,i,1))
next
BinVal=ret
End Function

Private Function BinVal2(bin)
'qiushuiwuhen (2002-8-12)
dim ret
ret = 0
for i = 1 to lenb(bin)
ret = ret *256 + ascb(midb(bin,i,1))
next
BinVal2=ret
End Function

Function getImageSize(filespec)
'qiushuiwuhen (2002-9-3)
dim ret(3)
aso.LoadFromFile(filespec)
bFlag=aso.read(3)
select case hex(binVal(bFlag))
case "4E5089":
aso.read(15)
ret(0)="PNG"
ret(1)=BinVal2(aso.read(2))
aso.read(2)
ret(2)=BinVal2(aso.read(2))
case "464947":
aso.read(3)
ret(0)="GIF"
ret(1)=BinVal(aso.read(2))
ret(2)=BinVal(aso.read(2))
case "535746":
aso.read(5)
binData=aso.Read(1)
sConv=Num2Str(ascb(binData),2 ,8)
nBits=Str2Num(left(sConv,5),2)
sConv=mid(sConv,6)
while(len(sConv)<nBits*4)
binData=aso.Read(1)
sConv=sConv&Num2Str(ascb(binData),2 ,8)
wend
ret(0)="SWF"
ret(1)=int(abs(Str2Num(mid(sConv,1*nBits+1,nBits),2)-Str2Num(mid(sConv,0*nBits+1,nBits),2))/20)
ret(2)=int(abs(Str2Num(mid(sConv,3*nBits+1,nBits),2)-Str2Num(mid(sConv,2*nBits+1,nBits),2))/20)
case "FFD8FF":
do
do: p1=binVal(aso.Read(1)): loop while p1=255 and not aso.EOS
if p1>191 and p1<196 then exit do else aso.read(binval2(aso.Read(2))-2)
do:p1=binVal(aso.Read(1)):loop while p1<255 and not aso.EOS
loop while true
aso.Read(3)
ret(0)="JPG"
ret(2)=binval2(aso.Read(2))
ret(1)=binval2(aso.Read(2))
case else:
if left(Bin2Str(bFlag),2)="BM" then
aso.Read(15)
ret(0)="BMP"
ret(1)=binval(aso.Read(4))
ret(2)=binval(aso.Read(4))
else
ret(0)=""
end if
end select
ret(3)="width=""" & ret(1) &""" height=""" & ret(2) &""""
getimagesize=ret
End Function
End Class

使用范例(读某目录下所有图片的宽度):
set qswh=new qswhImg

Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.GetFolder(server.mappath("."))
Set fc = f.Files
For Each f1 in fc
ext=fso.GetExtensionName(f1.path)
select case ext
case "gif","bmp","jpg","png":
arr=qswh.getImageSize(f1.path)
response.write "<br>" & arr(0) & " " & arr(3) & ":" & f1.name & " width:" & arr(1) & " height:" & arr(2)
case "swf"
arr=qswh.getimagesize(f1.path)
response.write "<br>" & arr(0) & " " & arr(3) & ":" & f1.name &am

时间: 2024-09-22 07:48:08

通过Adodb.Stream取得图像(BMP JPG PNG GIF SWF)的高度和宽度的相关文章

利用Adodb.Stream制作彩色验证码_应用技巧

Asp文件:Code.Asp 数据文件:body.Fix , Head.Fix 用法:<img src="code.asp"> 复制代码 代码如下: Response.buffer = true NumCode Function NumCode() Response.Expires = -1 Response.AddHeader "Pragma","no-cache" Response.AddHeader "cache-ct

利用Adodb.Stream制作彩色验证码

Asp文件:Code.Asp 数据文件:body.Fix , Head.Fix 用法:<img src="code.asp"> 复制代码 代码如下: Response.buffer = true NumCode Function NumCode() Response.Expires = -1 Response.AddHeader "Pragma","no-cache" Response.AddHeader "cache-ct

关于Adodb.Stream 的使用说明

ado|stream|ado|stream 组件:"Adodb.Stream"有下列方法:Cancel 方法 使用方法如下 Object.Cancel 说明:取消执行挂起的异步 Execute 或 Open 方法的调用.Close 方法 使用方法如下 Object.Close :关闭对像CopyTo 方法 使用方法如下 Object.CopyTo(destStream,[CharNumber]) 说明:将对像的数据复制,destStream指向要复制的对像,CharNumber为可选参

关于Adodb.Stream的写数据库数据到客户端

ado|stream|客户端|数据|数据库 这是一个从服务器数据库直接下数据到客户端文件的例子,文件名和扩展名可以根据需要随便写.new/temp.htm要求真实存在,其实没有什么作用,只是引导一下,否则不能对stram数据进行写操作. 网络上流传的这方面的东西不少,但多数是copy来的,很简单的事情搞得那么复杂.真正经过实践的东东少得可怜.于是自己写了一个,虽然简单,也有些问题,但是copy下去就可以用了.有问题的朋友可以跟我联系,好一起学习. filemystream=server.mapp

Adodb.Stream 组件的使用说明

ado|stream Adodb.Stream是ADO的Stream对象,提供存取二进制数据或者文本流,从而实现对流的读.写和管理等操作. 有下列方法:Cancel 方法     使用方法如下     Object.Cancel     说明:取消执行挂起的异步 Execute 或 Open 方法的调用.Close  方法     使用方法如下     Object.Close     :关闭对像CopyTo 方法     使用方法如下     Object.CopyTo(destStream,

组件:"Adodb.Stream" 浅释

ado|stream  组件:"Adodb.Stream" 有下列方法: Cancel 方法 使用方法如下 Object.Cancel 说明:取消执行挂起的异步 Execute 或 Open 方法的调用. Close 方法 使用方法如下 Object.Close 说明:关闭对像 CopyTo 方法 使用方法如下 Object.CopyTo(destStream,[CharNumber]) 说明:将对像的数据复制,destStream指向要复制的对像,CharNumber为可选参数,指要

adodb Stream 详细用法

ado|stream|ado|stream 组件:"Adodb.Stream"有下列方法:Cancel 方法     使用方法如下     Object.Cancel     说明:取消执行挂起的异步 Execute 或 Open 方法的调用.Close  方法     使用方法如下     Object.Close     :关闭对像CopyTo 方法     使用方法如下     Object.CopyTo(destStream,[CharNumber])     说明:将对像的数

使用XMLDOM,adodb.stream创建HTML文件

ado|dom|stream|xml|创建 XMLDOM的方法是在 l-blog 的作者 卫慧杰那里找到的,一直没听说这种方法,顺便整理一下adodb.stream的生成方法. 1.使用XMLDOMdim xmlStringxmlString="<html>" & chr(10) & "<head>" & chr(10) & "<title>test</title>"

利用ADODB.Stream使用浏览器下载服务器文件

ado|stream|服务器|浏览器|下载 download.asp?file=相对路径的文件就可以把这个文件下载下来 <%  2  3 call downloadFile(replace(replace(Request("file"),"\",""),"/",""))  4  5 Function downloadFile(strFile)  6 ' make sure you are on the