[导入]PHP缩略图函数
1
网上流行着各种PHP生成缩略图的函数、类,但是仔细一分析,总会有那么一点问题,最常见的就是在缩略图算法上。其实就是将一个矩形装入另一个矩形的计算方法,这种计算方法似乎在中学时期都已经用的熟透,但是一写到程序里面,则总是会出问题。我们将网上流行的一种生成缩略图的一个函数进行了分析,整理,并对其生成缩略图的质量进行了改进(需要GD2支持)。
2![]()
3
// 源文件格式:gif,jpg,jpe,jpeg,png
4
// 目的文件格式:jpg
5
// 参数说明:
6
// $srcFile 源文件
7
// $dstFile 目标文件
8
// $dstW 目标图象宽度
9
// $dstH 目标图象高度
10
function 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![]()
网上流行着各种PHP生成缩略图的函数、类,但是仔细一分析,总会有那么一点问题,最常见的就是在缩略图算法上。其实就是将一个矩形装入另一个矩形的计算方法,这种计算方法似乎在中学时期都已经用的熟透,但是一写到程序里面,则总是会出问题。我们将网上流行的一种生成缩略图的一个函数进行了分析,整理,并对其生成缩略图的质量进行了改进(需要GD2支持)。2

3
// 源文件格式:gif,jpg,jpe,jpeg,png 4
// 目的文件格式:jpg 5
// 参数说明: 6
// $srcFile 源文件 7
// $dstFile 目标文件 8
// $dstW 目标图象宽度 9
// $dstH 目标图象高度 10
function 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

文章来源:http://www.phpweblog.net/fuyongjie/archive/2008/04/10/3174.html

浙公网安备 33010602011771号