CI框架的图像处理类虽然可以支持等比例缩放,但是并不支持缩放后留白处理,也就是最后生成的画布跟你所要求的宽高是不一样的。如你要生成的图片缩略图为:360*172,最后生成的图片可能是360*150,也有可能是120*172。我们在做项目的时候有个要求,需要缩略图等比例缩放,并做两边留白处理,所以在原有代码的基础上修改了一下下CI图像处理类的源码
ci图像处理类: system/libraries/Image_lib.php
1.新增属性
private $final_width;
private $final_height;
2.大概在第826行找到
$copy($dst_img, $src_img, 0, 0, $this->x_axis, $this->y_axis, $this->width, $this->height, $this->orig_width, $this->orig_height);
在它后面新增代码:
//因项目需求,生成的缩略图需要留白处理 renguangzheng 18-01-28 start
if(!empty($this->final_width) && !empty($this->final_height))
{
$final_image = imagecreatetruecolor($this->final_width,$this->final_height);// 新建一个真彩色图像
$color = imagecolorallocate($final_image, 255, 255, 255);//为一幅图像分配颜色
imagefill($final_image, 0, 0, $color);//区域填充背景色
$x = round(($this->final_width - $this->width) / 2);//对浮点数进行四舍五入,求x轴位置
$y = round(($this->final_height - $this->height) / 2);//对浮点数进行四舍五入,求y轴位置
imagecopy($final_image,$dst_img,$x,$y,0,0,$this->width,$this->height);// 拷贝图像的一部分
// Show the image
if ($this->dynamic_output === TRUE)
{
$this->image_display_gd($final_image);
}
elseif ( ! $this->image_save_gd($final_image)) // Or save it
{
return FALSE;
}
imagedestroy($final_image);
}else
{
// Show the image
if ($this->dynamic_output === TRUE)
{
$this->image_display_gd($dst_img);
}
elseif ( ! $this->image_save_gd($dst_img)) // Or save it
{
return FALSE;
}
}
//因项目需求,生成的缩略图需要留白处理 renguangzheng 18-01-28 end
注意:记得把那个多余的代码要删了,因为我把它放到if里边了
// Show the image
if ($this->dynamic_output === TRUE)
{
$this->image_display_gd($dst_img);
}
elseif ( ! $this->image_save_gd($dst_img)) // Or save it
{
return FALSE;
}
3.调用修改后的图像处理类生成缩略图
$config['image_library'] = 'gd2';//设置要使用的图像库
$config['source_image'] = $imageInfo['full_path'];//设置原始图像的名称和路径
$config['new_image'] = BRAND_LOGO_DIR;//设置目标图像的名称和路径
$config['create_thumb'] = TRUE;//告诉图像处理函数生成缩略图
$config['maintain_ratio'] = TRUE;//指定是否在缩放或使用硬值的时候 使图像保持原始的纵横比例
$config['thumb_marker'] = '';//指定缩略图后缀
$config['width'] = 360;//设置你想要的图像宽度
$config['height'] = 172;//设置你想要的图像高度
$config['final_width'] = 360;//设置最后生成的图像宽度
$config['final_height'] = 172;//设置最后生成的图像高度
//加载图像处理类
$this->CI->load->library('image_lib',$config);
if(!$this->CI->image_lib->resize())
{
$error = $this->CI->image_lib->display_errors();
var_dump($error);
}
这样如果不需要留白边的话,只要不传$config['final_width']和$config['final_height'] 就可以了,是不是比自己再重新写个缩略图的方法简单多了
未修改前生成的缩略图162*172 修改后生成360*172缩略图生成的图像有白边哦,你可以右键查查看
网友评论