#######################################
本文章属于[雨浪]版权所有,转载必须声明
#######################################
最近做网站图片版块,由于虚拟主机不支持他方组件,无奈。
图片版块的排版成了大问题。经过仔细分析。网上图片一般
为图片集。也就是说一些相关的图片都是差不多大小。
好办了!!!!
图片的长与宽都是有比例的。如果我们从数据库中查找出比例相似的
的图片便很好把排版的问题解决了
图片的长宽可以在上传时通过如下代码取得:
建立类:
class imginfo
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
err.clear
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)
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)
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)
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)
dim ret
ret = 0
for i = 1 to lenb(bin)
ret = ret *256 + ascb(midb(bin,i,1))
next
binval2=ret
end function
private function getimagesize(filespec)
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)
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)
cas??楤?敲???,?e "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
public function imgw(pic_path)
set fso1 = server.createobject("scripting.filesystemobject")
if (fso1.fileexists(pic_path)) then
set f1 = fso1.getfile(pic_path)
ext=fso1.getextensionname(pic_path)
select case ext
case "gif","bmp","jpg","png":
arr=getimagesize(f1.path)
imgw = arr(1)
end select
set f1=nothing
else
imgw = 0
end if
set fso1=nothing
end function
public function imgh(pic_path)
set fso1 = server.createobject("scripting.filesystemobject")
if (fso1.fileexists(pic_path)) then
set f1 = fso1.getfile(pic_path)
ext=fso1.getextensionname(pic_path)
select case ext
case "gif","bmp","jpg","png":
arr=getimagesize(f1.path)
imgh = arr(2)
end select
set f1=nothing
else
imgh = 0
end if
set fso1=nothing
end function
end class
在上传储存以后实例类
假设图片存入的地址变量为:imgurl
则调用类
set yulang=new imginfo
w = yulang.imgw(server.mappath(imgurl))
h = yulang.imgh(server.mappath(imgurl))
set yulang=nothing
取得比例
flag=formatnumber(w/h,1)
存入数据库,ok了
下面是一个调用相似大小的子程序:
参数说明 (num 调用的个数)(w 载入时的宽度) (flag1 大于比例) (flag2 小于比例)
public sub pictvouchlist(num,w,flag1,flag2)
if num="" or w="" or flag1="" or flag2="" then exit sub
sql="select top "&num&" id,imgurl from myimg where flag>="&flag1&" and flag<="&flag2&""
set rs=conn.execute(sql)
if rs.bof and rs.eof then
response.write("暂无合适的图片")
else
img=rs(1)
…..自己去写吧,呵呵
end sub
好了就写到这里。大家看到了
如果把比例存入数据库
只用一个过程。就可以在页面上随意摆放大小合适的图片了