PbootCms模板默认的图片裁剪是从左上角开始裁剪,使用width,height,maxwidth,maxheight等参数进行调节。
但是裁剪出来的图片始终感觉不是那么令人满意。(也许是我不会用)
比如多人物合影,PB默认的裁剪是左上,那么这个裁剪就会丢掉C位,那怎么能行。
今天来优化一下裁剪图片,让他能简单快捷的裁剪出理想的图片。
我想要的效果是不论横图竖图都是居中裁剪。
翠花,上干货!
解决方案
首先找到裁剪缩略图的方法,
文件位置:/core/function/file.php
搜索:function cut_img,大约在447行
对cut_img方法进行优化,直接上代码:
02 |
function cut_img( $src_image , $out_image = null, int $new_width = null, int $new_height = null, $img_quality = 90) |
06 |
$out_image = $src_image ; |
09 |
if (! $new_width && ! $new_height ) |
13 |
list ( $width , $height , $type , $attr ) = getimagesize ( $src_image ); |
16 |
$img = imagecreatefromgif( $src_image ); |
19 |
$img = imagecreatefromjpeg( $src_image ); |
22 |
$img = imagecreatefrompng( $src_image ); |
28 |
$new_width = floor ( $width * ( $new_height / $height )); |
31 |
$new_height = floor ( $height * ( $new_width / $width )); |
34 |
$new_img = imagecreatetruecolor( $new_width , $new_height ); |
37 |
if ( $type == 1 || $type == 3) { |
38 |
$color = imagecolorallocate( $new_img , 255, 255, 255); |
39 |
imagefill( $new_img , 0, 0, $color ); |
40 |
imagecolortransparent( $new_img , $color ); |
45 |
$scale = max( $new_width / $width , $new_height / $height ); |
46 |
$scale_width = floor ( $scale * $width ); |
47 |
$scale_height = floor ( $scale * $height ); |
48 |
$scale_img = imagecreatetruecolor( $scale_width , $scale_height ); |
49 |
if (function_exists( "ImageCopyResampled" )) { |
50 |
imagecopyresampled( $scale_img , $img , 0, 0, 0, 0, $scale_width , $scale_height , $width , $height ); |
52 |
imagecopyresized( $scale_img , $img , 0, 0, 0, 0, $scale_width , $scale_height , $width , $height ); |
55 |
$start_x = ( $scale_width - $new_width ) / 2; |
56 |
$start_y = ( $scale_height - $new_height ) / 2; |
59 |
imagecopy( $new_img , $scale_img , 0, 0, $start_x , $start_y , $scale_width , $scale_height ); |
61 |
check_dir(dirname( $out_image ), true); |
65 |
imagegif( $new_img , $out_image , $img_quality ); |
68 |
imagejpeg( $new_img , $out_image , $img_quality ); |
71 |
imagepng( $new_img , $out_image , $img_quality / 10); |
74 |
imagejpeg( $new_img , $out_image , $img_quality ); |
76 |
imagedestroy( $new_img ); |
|
小伙伴可以直接复制替换该方法。
使用方法
2 |
<a href= "[list:link]" ><img src= "[list:ico width=600 height=400]" /></a> |
|
如上代码,直接生成600*400像素的居中裁剪过的图片。
收工。
举个例子:列表中输出图片