Adodb.Stream取得图像的高宽

原创 2004年08月07日 10:26:00

Adodb.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 & " width:" & arr(1) & " height:" & arr(2)
end select

Next
Set fc=nothing
Set f=nothing
Set fso=nothing
Set qswh=nothing

ps.其中swf部分的参考资料由蓝色提供,:p

蓝色补充:由于 flashmx 采用了新的压缩格式 swf,所以取 flashmx 压缩格式的 swf 文件长宽并不会准确,解决办法,正在研究中。

如何利用OpenCV获得图像的宽高、行宽字节和通道数

在图像处理的程序中,有时候会有一些参数要得到图像的宽高和通道等,这是一个小问题,但是如果让你自己来实现,也得想一下,后来查阅OpenCV,发现其自带的数据类型中就有这个参数,可以直接获得。 第一种 I...
  • cwt19902010
  • cwt19902010
  • 2017年04月21日 20:55
  • 5276

Opencv中Mat图的长、宽、行、列以及图像像素

今天在看矩形滤波的时候被一些gailian
  • roypi
  • roypi
  • 2014年08月29日 17:27
  • 15365

JS快速获取图片宽高的方法

快速获取图片的宽高其实是为了预先做好排版样式布局做准备,通过快速获取图片宽高的方法比onload方法要节省很多时间,甚至一分钟以上都有可能,并且这种方法适用主流浏览器包括IE低版本浏览器。 我们一步...
  • wuchengzhi82
  • wuchengzhi82
  • 2014年03月18日 16:25
  • 29495

使用vbs读写文件(Adodb.Stream)方式

  • 2013年05月27日 15:39
  • 9KB
  • 下载

asp用adodb.stream保存utf-8文件时去掉bom头

function putTextContent(path, data, chrs) { chrs = (chrs || "utf-8").toLowerCase(); var com = new ...
  • fengwusan
  • fengwusan
  • 2017年11月15日 23:31
  • 36

ADODB.Stream的属性和用法

ADODB.Stream的属性和用法 组件:"Adodb.Stream"  有下列方法:  Cancel 方法  使用方法如下  Object.Cancel  说明:取消执行挂起的异步 E...
  • u014739757
  • u014739757
  • 2014年04月24日 09:34
  • 345

ADODB.Stream的用法实例

程序代码: 内容: download.asp?file=相对路径的文件 就可以把这个文件下载下来 call downloadFile(replace(replace(Request("fi...
  • smave88
  • smave88
  • 2013年07月02日 22:29
  • 488

自定义文件下载支持断点续传(HTTP_RANGE Adodb.Stream)

自定义文件下载基本上用在以下几处  1.浏览器已知类型,如Avi,Doc等如果本地安装了关联程序就会自动在浏览器上打开  2.权限管理,有时候不是所有的人都允许下载,所以需要在下载的时候进行判...
  • smave88
  • smave88
  • 2014年04月21日 17:29
  • 409

VBS之adodb.stream对象的方法/属性

adodb.stream对象的方法/属性 Cancel 方法 使用方法如下 Object.Cancel 说明:取消执行挂起的异步 Execute 或 Open 方法的调用。 C...
  • icanlove
  • icanlove
  • 2014年09月19日 10:21
  • 9246

无法创建 ADODB.Stream 对象

禁用 要通过手动创建注册表项来禁用 ADODB.Stream 对象,请按照下列步骤操作: 1. 关闭所有打开的 Internet Explorer 浏览器窗口。 2. ...
  • bruce_hz
  • bruce_hz
  • 2011年08月12日 17:56
  • 1859
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Adodb.Stream取得图像的高宽
举报原因:
原因补充:

(最多只允许输入30个字)