本文实例讲述了php实现的自定义图像居中裁剪函数。分享给大家供大家参考,具体如下:
图像居中裁减的大致思路:
1.首先将图像进行缩放,使得缩放后的图像能够恰好覆盖裁减区域。(imagecopyresampled — 重采样拷贝部分图像并调整大小)
2.将缩放后的图像放置在裁减区域中间。(imagecopy — 拷贝图像的一部分)
3.裁减图像并保存。(imagejpeg | imagepng | imagegif — 输出图象到浏览器或文件)
具体代码:
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
|
//==================缩放裁剪函数====================
/**
* 居中裁剪图片
* @param string $source [原图路径]
* @param int $width [设置宽度]
* @param int $height [设置高度]
* @param string $target [目标路径]
* @return bool [裁剪结果]
*/
function image_center_crop( $source , $width , $height , $target )
{
if (! file_exists ( $source )) return false;
/* 根据类型载入图像 */
switch (exif_imagetype( $source )) {
case imagetype_jpeg:
$image = imagecreatefromjpeg( $source );
break ;
case imagetype_png:
$image = imagecreatefrompng( $source );
break ;
case imagetype_gif:
$image = imagecreatefromgif( $source );
break ;
}
if (!isset( $image )) return false;
/* 获取图像尺寸信息 */
$target_w = $width ;
$target_h = $height ;
$source_w = imagesx( $image );
$source_h = imagesy( $image );
/* 计算裁剪宽度和高度 */
$judge = (( $source_w / $source_h ) > ( $target_w / $target_h ));
$resize_w = $judge ? ( $source_w * $target_h ) / $source_h : $target_w ;
$resize_h = ! $judge ? ( $source_h * $target_w ) / $source_w : $target_h ;
$start_x = $judge ? ( $resize_w - $target_w ) / 2 : 0;
$start_y = ! $judge ? ( $resize_h - $target_h ) / 2 : 0;
/* 绘制居中缩放图像 */
$resize_img = imagecreatetruecolor( $resize_w , $resize_h );
imagecopyresampled( $resize_img , $image , 0, 0, 0, 0, $resize_w , $resize_h , $source_w , $source_h );
$target_img = imagecreatetruecolor( $target_w , $target_h );
imagecopy( $target_img , $resize_img , 0, 0, $start_x , $start_y , $resize_w , $resize_h );
/* 将图片保存至文件 */
if (! file_exists (dirname( $target ))) mkdir (dirname( $target ), 0777, true);
switch (exif_imagetype( $source )) {
case imagetype_jpeg:
imagejpeg( $target_img , $target );
break ;
case imagetype_png:
imagepng( $target_img , $target );
break ;
case imagetype_gif:
imagegif( $target_img , $target );
break ;
}
// return boolval(file_exists($target));//php5.5以上可用boolval()函数获取返回的布尔值
return file_exists ( $target )?true:false; //兼容低版本php写法
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
//==================函数使用方式====================
// 原始图片的路径
$source = '../source/img/middle.jpg' ;
$width = 480; // 裁剪后的宽度
$height = 480; // 裁剪后的高度
// 裁剪后的图片存放目录
$target = '../source/temp/resize.jpg' ;
// 裁剪后保存到目标文件夹
if (image_center_crop( $source , $width , $height , $target )) {
echo "原图1440*900为:<img src='$source'>" ;
echo "<hr>" ;
echo "修改后图片480*480为:<img src='$target'>" ;
}
|
运行效果:
原图1440*900为:
修改后图片480*480为:
同理,480*320,、800*600等尺寸的图片只需修改相应参数即可。
附:代码测试中遇到的问题
报错:call an undefined function exif_imagetype()
解决方法:
打开扩展 extension=php_exif.dll
并将extension=php_mbstring.dll
,放到extension=php_exif.dll
前边
另:boolval()
函数为php5.5版本以上才能使用的函数,本文测试代码中为兼容低版本,使用如下语句代替:
1
|
return file_exists ( $target )?true:false;
|
希望本文所述对大家php程序设计有所帮助。
原文链接:http://www.cnblogs.com/woider/p/6380491.html