无组件生成缩略图的操作方法

2018-12-27 07:43:22来源:爱站网 阅读 ()

新老客户大回馈,云服务器低至5折

有许多ASP组件在互联网上都可以生成缩略图,如果你的虚拟空间不支持注册新的组件,这个时候你可能会觉得你的网站已经失去了光彩,那么无组件生成缩略图的操作步骤大家都了解吗?一起跟着爱站技术频道小编来了解吧!

无组件生成缩略图

还是先看看基础部分吧。首先,我们知道在页面中显示图片是如下代码:
src是图片路径,border控制图片边缘宽度,width是图片的长度,height是图片的高度。缩略图的生成其实就是在原始尺寸上缩放。但一般为了尽量少失真,我们都会按比例缩放。于是,获取图片的长宽尺寸也就成了生成缩略图的重点。

下面便是编写无组件生成缩略图的步骤:

1.无组件获取图片大小

以前刚学ASP不久时看到过一篇利用ASCII码实现无组件获取图片尺寸的文章。后来试了试,发现在获取jpg类图片尺寸时总是不能正确显示,在网上查了查,居然有不少网站转载这个程序,但没有一家指出此程序的缺陷,也就更谈不上解决缺陷的办法了。后来又google了一下,终于找到了一篇介绍利用ADODB.stream获取图片尺寸的文章,按其介绍的方法,修改里面的代码试了试,效果真的还不错,现在将其拿出来与大家分享:

利用ADODB.stream获取图片尺寸的通用类?<%
'////////////?GPS:Get?Picture?Size?//////////////
'//////////////利用ADODB.stream获取图片尺寸//////////////
'/////////Cited?By?Leon(心晴)?2005年8月11日//////////
Class?GPS
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)
'GPS?(2005-8-11)
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)
'GPS?(2005-8-11)
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)
'GPS?(2002-8-11)
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)
'GPS?(2002-8-11)
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)?
'GPS?(2002-8-11)
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)
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
%>

将以上代码复制生成GPS.asp文件,这样无组件获取图片尺寸的通用类就OK了。



2.获取图片路径

由于不只一张图片,以及图片需分类存放,我们在数据库中设计了一个存放图片相对路径的字段ImgURL。我们把上传的图片都放在一个名为images的文件夹中(至于如何无组件上传图片心晴就不在多说了)。现在我们先设计一个ShowImg.asp页面用来显示缩略图及相关信息。具体设计如下:

图片:

图片格式:

图片尺寸:

图片大小:

点击次数:


下面,我们获取图片的绝对路径。代码如下:

<%?
'/////获取ShowImg.asp的绝对路径/////
Dim?curFile
curFile=Server.mappath(Request.servervariables("PATH_INFO"))

Dim?curfilename,filename

'/////图片相对路径(存于数据库中)
cufilename=rs("ImgURL")
'/////因为ShowImg.asp与images在同一目录,所以我们用instrrev获取images的路径/////
filename=left(curFile,instrrev(curFile,"\"))&cufilename

'/////建立GPS类实体/////
Dim?GetPicSize
Set?GetPicSize=new?GPS

Set?fs=Server.CreateObject("Scripting.FileSystemObject")
'/////获取图片类型/////
Dim?PicSuffixName
PicSuffixName=fs.GetExtensionName(filename)

Dim?PD?'//Picture?Dimension
Dim?PWidth,PHeight

Select?Case?PicSuffixName
Case?"gif","bmp","jpg","png":
'/////调用GPS通用类中的GetImageSize函数获取图片尺寸/////
PD=GetPicSize.GetImageSize(filename)
PWidth=PD(1)?'//获取图片宽度
PHeight=PD(2)?'//获取图片高度
Case?"swf"
PD=GetPicSize.GetImageSize(filename)
PWidth=PD(1)?'//获取Flash宽度
PHeight=PD(2)?'//获取Flash高度
Case?Else
End?Select

Set?fs=Nothing
Set?GetPicSize=Nothing
%>



将上面的代码复制到
*4)>?>

的上面就OK了!

当然,有人会说,获取路径不一定要用PATH_INFO,直接用server.mappath()不就可以了嘛,呵呵,萝卜青菜各有所爱,主要是我用PATH_INFO可以实现FSO的一些功能而用server.mappath()没有搞定,所以一直使用这个。

3.定义缩略图尺寸
这部分代码就是仁者见仁,智者见智了。首先,我们需要规定缩略图显示尺寸范围,譬如:300X260,代码可以这样写:
<%
Dim?PXWidth,PXHeight
Dim?Pp?'//Proportion
If?PWidth=0?Or?PWidth=""?Then
PXWidth=0
PXHeight=0
Else
Pp=FormatNumber(PWidth/PHeight,2)?'//长宽比
End?If
If?PWidth>=PHeight?Then
If?PWidth>=300?Then
PXWidth=300
PXHeight=FormatNumber(300/Pp,0)
Else
PXWidth=PWidth
PXHeight=PHeight
End?If
Else
If?PHeight>=260?Then
PXHeight=260
PXWidth=FormatNumber(260*Pp,0)
Else
PXWidth=PWidth
PXHeight=PHeight
End?If
End?If
%>
将上面的代码紧接第二步写下即可。调用时代码如下:
?border="0"?width=<%=PXWidth%>?height=<%=PXHeight%>>
至于图片格式可以用<%=PicSuffixName%>得到,图片尺寸可以写成
<%?
response.write?PXWidth&"X"&PXHeight
%>
图片大小可以用FSO.GetFileSize(filename)来实现,而点击次数可以简单地用SQL语句实现,具体编码就不再累述了。

这样,一个无组件生成缩略图程序就写好了,可能有点拿来主义,不过只要大家能将方法掌握相信还是有很大提高的。 ?>

上文是关于无组件生成缩略图的操作方法,相信大家都有了一定的了解,想要了解更多的技术信息,请继续关注爱站技术频道吧!

?

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:ASP代码与页面的分离技术

下一篇:教你缓存提高asp程序的性能