1网上流行着各种PHP生成缩略图的函数、类,但是仔细一分析,总会有那么一点问题,最常见的就是在缩略图算法上。其实就是将一个矩形装入另一个矩形的计算方法,这种计算方法似乎在中学时期都已经用的熟透,但是一写到程序里面,则总是会出问题。我们将网上流行的一种生成缩略图的一个函数进行了分析,整理,并对其生成缩略图的质量进行了改进(需要GD2支持)。
2
3// 源文件格式:gif,jpg,jpe,jpeg,png
4// 目的文件格式:jpg
5// 参数说明:
6// srcFile 源文件
7// dstFile 目标文件
8// dstW 目标图象宽度
9// dstH 目标图象高度
10function makethumb(srcFile,dstFile,dstW,dstH) {
11 data = GetImageSize(srcFile,info);
12 switch (data[2]){
13 case 1:
14 im = @ImageCreateFromGIF(srcFile);
15 break;
16 case 2:
17 im = @imagecreatefromjpeg(srcFile);
18 break;
19 case 3:
20 im = @ImageCreateFromPNG(srcFile);
21 break;
22 }
23 srcW=ImageSX(im);
24 srcH=ImageSY(im);
25 dstX=0;
26 dstY=0;
27/*
28 if (srcW*dstH>srcH*dstW) {
29 fdstH=round(srcH*dstW/srcW);
30 dstY=floor((dstH-fdstH)/2);
31 fdstW=dstW;
32 }else{
33 fdstW=round(srcW*dstH/srcH);
34 dstX=floor((dstW-fdstW)/2);
35 fdstH=dstH;
36 }
37*/
38 bili=srcW/srcH;
39 if(srcW * srcH >= dstW * dstH){
40 if(srcW >srcH){
41 fdstW=dstW;
42 fdstH=ceil(fdstW / bili);
43 }else{
44 fdstH=dstH;
45 fdstW=ceil(fdstH * bili);
46 }
47 }else{
48 if(srcW <= dstW && srcH <= dstH){
49 fdstW=srcW;
50 fdstH=srcH;
51 }elseif(srcW >= dstW){
52 fdstW=dstW;
53 fdstH=ceil(fdstW / bili);
54 }else{
55 fdstH=dstH;
56 fdstW=ceil(fdstH * bili);
57 }
58 }
59 //echo fdstW,’:\',fdstH;
60 //ni=imagecreatetruecolor(dstW,dstH);
61 ni=imagecreatetruecolor(fdstW,fdstH);
62 dstX=(dstX<0)?0:dstX;
63 dstY=(dstX<0)?0:dstY;
64 dstX=(dstX>(dstW/2))?floor(dstW/2):dstX;
65 dstY=(dstY>(dstH/2))?floor(dstH/s):dstY;
66
67 black = ImageColorAllocate(ni, 255,255,255);//填充的背景色:黑色
68 imagefilledrectangle(ni,0,0,dstW,dstH,black);
69 //imagecopyresampled(ni,im,dstX,dstY,0,0,fdstW,fdstH,srcW,srcH);
70 imagecopyresampled(ni,im,0,0,0,0,fdstW,fdstH,srcW,srcH);
71 ImageJpeg(ni,dstFile);//图片直接输出二个参数去掉用header()mine类型
72 imagedestroy(im);
73 imagedestroy(ni);
74}
75
76