注:此功能依赖GD2图形库
最近要用php生成缩略图,在网上找了一下,发现了这篇文章:PHP生成图片缩略图
试用了一下后,发现有这样几个问题:
2、png图片生成的缩略图没有了透明(半透明)效果(填充了黑色背景)
3、代码语法比较老
因此,在这个版本的基础上简单修改优化了一下。
PHP生成缩略图类
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
<?php /* * desc: Resize Image(png, jpg, gif) * author: 十年后的卢哥哥 * date: 2014.11.13 */ class ResizeImage { //图片类型 private $type ; //实际宽度 private $width ; //实际高度 private $height ; //改变后的宽度 private $resize_width ; //改变后的高度 private $resize_height ; //是否裁图 private $cut ; //源图象 private $srcimg ; //目标图象地址 private $dstimg ; //临时创建的图象 private $im ; function __construct( $imgPath , $width , $height , $isCut , $savePath ) { $this ->srcimg = $imgPath ; $this ->resize_width = $width ; $this ->resize_height = $height ; $this ->cut = $isCut ; //图片的类型 $this ->type = strtolower ( substr ( strrchr ( $this ->srcimg, "." ),1)); //初始化图象 $this ->initi_img(); //目标图象地址 $this -> dst_img( $savePath ); //-- $this ->width = imagesx( $this ->im); $this ->height = imagesy( $this ->im); //生成图象 $this ->newimg(); ImageDestroy ( $this ->im); } private function newimg() { //改变后的图象的比例 $resize_ratio = ( $this ->resize_width)/( $this ->resize_height); //实际图象的比例 $ratio = ( $this ->width)/( $this ->height); if ( $this ->cut) { //裁图 $newimg = imagecreatetruecolor( $this ->resize_width, $this ->resize_height); if ( $this ->type== "png" ) { imagefill( $newimg , 0, 0, imagecolorallocatealpha( $newimg , 0, 0, 0, 127)); } if ( $ratio >= $resize_ratio ) { //高度优先 imagecopyresampled( $newimg , $this ->im, 0, 0, 0, 0, $this ->resize_width, $this ->resize_height, (( $this ->height)* $resize_ratio ), $this ->height); } else { //宽度优先 imagecopyresampled( $newimg , $this ->im, 0, 0, 0, 0, $this ->resize_width, $this ->resize_height, $this ->width, (( $this ->width)/ $resize_ratio )); } } else { //不裁图 if ( $ratio >= $resize_ratio ) { $newimg = imagecreatetruecolor( $this ->resize_width,( $this ->resize_width)/ $ratio ); if ( $this ->type== "png" ) { imagefill( $newimg , 0, 0, imagecolorallocatealpha( $newimg , 0, 0, 0, 127)); } imagecopyresampled( $newimg , $this ->im, 0, 0, 0, 0, $this ->resize_width, ( $this ->resize_width)/ $ratio , $this ->width, $this ->height); } else { $newimg = imagecreatetruecolor(( $this ->resize_height)* $ratio , $this ->resize_height); if ( $this ->type== "png" ) { imagefill( $newimg , 0, 0, imagecolorallocatealpha( $newimg , 0, 0, 0, 127)); } imagecopyresampled( $newimg , $this ->im, 0, 0, 0, 0, ( $this ->resize_height)* $ratio , $this ->resize_height, $this ->width, $this ->height); } } if ( $this ->type== "png" ) { imagesavealpha( $newimg , true); imagepng ( $newimg , $this ->dstimg); } else { imagejpeg ( $newimg , $this ->dstimg); } } //初始化图象 private function initi_img() { if ( $this ->type== "jpg" ) { $this ->im = imagecreatefromjpeg( $this ->srcimg); } if ( $this ->type== "gif" ) { $this ->im = imagecreatefromgif( $this ->srcimg); } if ( $this ->type== "png" ) { $this ->im = imagecreatefrompng( $this ->srcimg); } } //图象目标地址 private function dst_img( $dstpath ) { $full_length = strlen ( $this ->srcimg); $type_length = strlen ( $this ->type); $name_length = $full_length - $type_length ; $name = substr ( $this ->srcimg,0, $name_length -1); $this ->dstimg = $dstpath ; } } ?> |
使用
使用时,直接调用类的构造函数即可,构造函数如下:
$resizeimage = new resizeimage($imgPath, $width, $height, $isCut, $savePath);
参数
$imgPath:原图片地址
$width:缩略图宽
$height:缩略图高
$isCut:是否裁剪,bool值
$savePath:缩略图地址(可以跟原图片地址相同)
示例
1
2
3
4
5
6
7
8
9
10
|
<?php include "ResizeImage.php" ; //jpg $jpgResize = new ResizeImage( "img/test_1920_1200.jpg" , 320, 240, false, "img/test_320_240.jpg" ); //png $pngResize = new ResizeImage( "img/test_1024_746.png" , 320, 240, false, "img/test_320_240.png" ); ?> |
效果