インターネット上には、サムネイルを生成する ASP コンポーネントが多数あります。仮想空間が新しいコンポーネントの登録をサポートしていない場合、Web サイトの輝きが失われたと感じるかもしれません。私はあまり才能がないので、オンラインのリソースを組み合わせて、参考のためにコンポーネントフリーのサムネイル生成プログラムを作成しました。
まずは基本を見てみましょう。まず、ページに画像を表示するコードは次のとおりであることがわかります。
<img src=pic.gif border=0 width=300 height=260>
src は画像のパス、border は画像のエッジの幅を制御し、width は画像の長さ、height は画像の高さです。サムネイルの生成では、実際には元のサイズに合わせて拡大縮小されます。ただし、一般的には歪みを最小限に抑えるために、比例的に拡大縮小します。したがって、画像の長さと幅の寸法を取得することが、サムネイルを生成する際の焦点となっています。
コンポーネントフリーのサムネイル生成を作成する手順は次のとおりです。
1. コンポーネントを含まない画像サイズを取得する
少し前に初めて ASP を学んだとき、ASCII コードを使用してコンポーネントなしで画像サイズを取得する記事を見ました。後で試してみたところ、jpg画像のサイズが正しく表示されないことがわかりました。ネットで調べたところ、このプログラムを転載したサイトは数多くありましたが、このプログラムの欠点を指摘する人はおらず、解決する人もいませんでした。解決しました。その後、再度Googleで検索したところ、ADODB.streamを使用して画像サイズを取得することを紹介した記事を見つけました。その方法に従って、内部のコードを変更して試してみました。効果は非常に優れていました。あなたと。 :
ADODB.stream を使用して画像サイズの一般的なクラスを取得します
<%
'///////////// GPS: 画像サイズを取得 ///////////////
'//////////////ADODB.stream を使用して画像サイズを取得します///////////////
'/////////Leon (心清) より引用、2005 年 8 月 11 日//////////
クラスGPS
ほのか麻生
プライベートサブクラス_初期化
aso=CreateObject(Adodb.Stream) を設定します。
aso.モード=3
aso.Type=1
aso.開く
エンドサブ
プライベートサブクラス_Terminate
aso=何も設定しない
エンドサブ
プライベート関数 Bin2Str(Bin)
ディム I、ストラ
I=1 の場合 LenB(Bin)
clow=MidB(Bin,I,1)
AscB(クロウ)<128 の場合
Str = Str & Chr(ASCB(クロウ))
それ以外
I=I+1
I <= LenB(Bin) の場合、Str = Str & Chr(ASCW(MidB(Bin,I,1)&clow))
endIf
次
Bin2Str = Str
終了機能
プライベート関数 Num2Str(num,base,lens)
'GPS (2005-8-11)
薄暗い
レット =
while(数値>=ベース)
ret = (数値 mod ベース) & ret
数値 = (数値 - 数値 mod ベース)/ベース
曲がります
Num2Str = right(string(lens,0) & num & ret,lens)
終了機能
プライベート関数 Str2Num(str,base)
'GPS (2005-8-11)
薄暗い
ret = 0
i=1 から len(str) まで
ret = ret *base + cint(mid(str,i,1))
次
Str2Num=ret
終了機能
プライベート関数 BinVal(bin)
'GPS (2002-8-11)
薄暗い
ret = 0
i = lenb(bin) から 1 ステップ -1 の場合
ret = ret *256 + ascb(midb(bin,i,1))
次
BinVal=ret
終了機能
プライベート関数 BinVal2(bin)
'GPS (2002-8-11)
薄暗い
ret = 0
i = 1 から lenb(bin) まで
ret = ret *256 + ascb(midb(bin,i,1))
次
BinVal2=ret
終了機能
'///以下は呼び出しコードです///
関数 getImageSize(filespec)
'GPS (2002-8-11)
薄暗い(3)
aso.LoadFromFile(ファイルスペック)
bFlag=aso.read(3)
select case hex(binVal(bFlag))
ケース4E5089:
aso.read(15)
ret(0)=PNG
ret(1)=BinVal2(aso.read(2))
aso.read(2)
ret(2)=BinVal2(aso.read(2))
ケース 464947:
aso.read(3)
ret(0)=GIF
ret(1)=BinVal(aso.read(2))
ret(2)=BinVal(aso.read(2))
ケース 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)
曲がります
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)
ケースFFD8FF:
する
do: p1=binVal(aso.Read(1)): p1=255 で、aso.EOS ではない間にループします。
p1>191 かつ p1<196 の場合、終了します。else を実行します aso.read(binval2(aso.Read(2))-2)
do:p1=binVal(aso.Read(1)):p1<255 かつ aso.EOS ではない場合のループ
trueの間ループする
aso.Read(3)
ret(0)=JPG
ret(2)=binval2(aso.Read(2))
ret(1)=binval2(aso.Read(2))
それ以外の場合:
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))
それ以外
ret(0)=
終了する場合
エンドセレクト
ret(3)=幅= & ret(1) & 高さ=
& ret(2) &
getimagesize=ret
終了機能
終了クラス
%>
上記のコードをコピーして GPS.asp ファイルを生成すると、コンポーネントなしで画像サイズを取得するための一般的なクラスが OK になります。
2.画像パスを取得する
画像が複数あり、画像をカテゴリに保存する必要があるため、画像の相対パスを保存するフィールド ImgURL をデータベースに設計しました。アップロードされたすべての写真は、images というフォルダーに入れられます (コンポーネントなしで写真をアップロードする方法については詳しく説明しません)。ここで、まずサムネイルと関連情報を表示する ShowImg.asp ページを設計します。具体的なデザインは以下の通りです。
写真:
画像フォーマット:
画像サイズ:
画像サイズ:
クリック数:
次に、画像の絶対パスを取得します。コードは次のとおりです。
<%
'/////ShowImg.aspの絶対パスを取得/////
ディム curFile
curFile=Server.mappath(Request.servervariables(PATH_INFO))
Dim curfilename,filename
'/////画像への相対パス (データベースに保存されている)
cufilename=rs(ImgURL)
'/////ShowImg.asp は画像と同じディレクトリにあるため、instrrev を使用して画像のパスを取得します/////
ファイル名=left(curFile,instrrev(curFile,/))&cufilename
'/////GPS クラス エンティティを作成/////
ディム GetPicSize
GetPicSize=新しい GPS を設定します
fs=Server.CreateObject(Scripting.FileSystemObject) を設定します。
'/////画像タイプを取得/////
Dim PicSuffixName
PicSuffixName=fs.GetExtensionName(ファイル名)
Dim PD '//ピクチャーディメンション
寸法 P幅、P高さ
ケースの選択 PicSuffixName
ケース gif、bmp、jpg、png:
'/////GPS 一般クラスの GetImageSize 関数を呼び出して画像サイズを取得します/////
PD=GetPicSize.GetImageSize(ファイル名)
PWidth=PD(1) '//画像の幅を取得
PHeight=PD(2) '//画像の高さを取得します
ケースSWF
PD=GetPicSize.GetImageSize(ファイル名)
PWidth=PD(1) '//フラッシュ幅を取得
PHeight=PD(2) '//フラッシュの高さを取得します
それ以外の場合
エンドセレクト
fs=何も設定しない
GetPicSize=Nothing を設定します
%>
上記のコードを<body>の先頭にコピーすればOKです。
もちろん、パスを取得するために PATH_INFO を使用する必要はなく、server.mappath() を直接使用すればよいという人もいるでしょう。笑、主な理由は、PATH_INFO を使用して実行できるからです。 FSO の一部の機能を実現し、.mappath() を使用しても機能しなかったので、これを使い続けました。
3. サムネイルのサイズを定義する
コードのこの部分は見る人の目にあり、賢者は知恵を見ます。まず、サムネイルの表示サイズ範囲を指定する必要があります (例: 300X260)。コードは次のように記述できます。
<%
寸法 PX幅、PX高さ
Dim Pp '//プロポーション
PWidth=0 または PWidth= の場合
PX幅=0
PX高さ=0
それ以外
Pp=FormatNumber(PWidth/PHeight,2) '//アスペクト比
終了の場合
PWidth>=PHeight の場合
PWidth>=300 の場合
PX幅=300
PXHeight=フォーマット番号(300/Pp,0)
それ以外
PX幅=P幅
PX高さ=P高さ
終了の場合
それ以外
PHeight>=260 の場合
PX高さ=260
PXWidth=フォーマット番号(260*Pp,0)
それ以外
PX幅=P幅
PX高さ=P高さ
終了の場合
終了の場合
%>
2 番目のステップの直後に上記のコードを記述するだけです。呼び出し時のコードは次のとおりです。
<img src=<%=curfilename%> border=0 width=<%=PXWidth%>
高さ=<%=PX高さ%>>
画像形式については、<%=PicSuffixName%> を使用して取得でき、画像サイズは次のように記述できます。
<%
応答.write PXWidth&X&PXHeight
%>
画像サイズは FSO.GetFileSize(filename) を使用して実現でき、クリック数は SQL ステートメントを使用して簡単に実現できます。具体的なコーディングの説明は省略します。
このように、コンポーネントフリーのサムネイル生成プログラムが作成されました。ちょっと借り物かもしれませんが、誰もが方法をマスターできれば、かなり改善されると思います。