注:此功能依赖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" );
?>
|
效果