php个人工作经验以及生活体会博客 php工作,生活

23十二/116

php制作图片缩略图,不失真

在使用相册封面,幻灯片时,如果图片没有进行过处理经常会出现失真的情况,页面会显的很难看。

今天在开发phpwind的群组相册时就遇到了同样的问题,在网上找了许多相关资料,有许多相关的制作裁剪图片的程序,不过做的还不够理想,或者说不能满足我们项目的要求,于是在这些基础上我

写了一段小程序。举个列子说明:

比如有一张500*600的图片,需要制作成100*100的缩略图,要求是不能失真!

程序执行过程是,先判断原图的尺寸缩放成100*120的图片,然后再从左上角截取成100*100的图片。

但图片宽或者是高不足100时,程序会以不足100的高或宽为准,生成缩略图,例如:90*200的图片就会生成90*100的图片,也就是宽不变,沿着高截取100像素

若是高宽均不是100的时候就直接用图片当成缩略图。
程序如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/**
*等比列截取图片生成缩略图
*$width需要缩放的宽度
*$height需要缩放的高度
*$filename文件来源
*$imagename生成后的文件名
*$size缩放形式,small为缩放后的图片不超过设置的高宽,big为缩放后的图片不小于设置的高宽
*/

function get_img($width,$height,$filename,$imagename,$size='small'){

list($width_orig, $height_orig) = getimagesize($filename);
if($width_orig {
$w=$width_orig;
$h=$height_orig;
}elseif($width_orig$height){
$w=$width_orig;
$h=$height;
}elseif($width_orig>$width&&$height_orig $w=$width;
$h=$height_orig;
}else {
$w=$width;
$h=$height;
}
if($size=='big'){
if ($width && ($width_orig < $height_orig)) {
$height = ($width / $width_orig) * $height_orig;
} else {
$width = ($height / $height_orig) * $width_orig;
}
}elseif($size='small'){
if ($width && ($width_orig < $height_orig)) {
$width = ($height / $height_orig) * $width_orig;
} else {
$height = ($width / $width_orig) * $height_orig;
}
}else{
echo '参数错误';exit;
}
$image_p = imagecreatetruecolor($w, $h);
$type = strtolower(substr(strrchr($filename,"."),1));
if($type == 'jpeg') $type = 'jpg';
switch($type){
case 'bmp': $image = imagecreatefromwbmp($filename); break;
case 'gif': $image = imagecreatefromgif($filename); break;
case 'jpg': $image = imagecreatefromjpeg($filename); break;
case 'png': $image = imagecreatefrompng($filename); break;
default : return "Unsupported picture type!";
}
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);
imagejpeg($image_p, $imagename, '100');
}
//使用范例
get_img(100,100,'img/1.jpg','img/2.jpg','big');