laravel 使用 Intervention/image 进行图片处理
在 Laravel 5 中集成 Intervention Image 实现对图片的创建、修改和压缩处理
Intervention Image 是一个 PHP 图片操作处理库,为图片创建、修改及压缩等处理提供了便捷方式。此外,还提供了服务提供者和门面以便集成到 Laravel 应用中。
1、安装
安装 Intervention Image 之前,需要确保 PHP 版本 >=5.4 并且安装了 Fileinfo 扩展,以及 GD 库(>=2.0)或者 Imagick 扩展(>=6.5.7)。
composer require intervention/image
2、集成到 Laravel
安装好 Intervention Image 后,打开 config/app.php,
注册如下服务提供者到 $providers 数组:
Intervention\Image\ImageServiceProvider::class
然后添加如下门面到 $aliaes 数组:
‘Image’ => Intervention\Image\Facades\Image::class
3.使用
1、上传图片并保存 // 修改指定图片的大小 $img = Image::make('images/avatar.jpg')->resize(200, 200); // 插入水印, 水印位置在原图片的右下角, 距离下边距 10 像素, 距离右边距 15 像素 $img->insert('images/watermark.png', 'bottom-right', 15, 10); // 将处理后的图片重新保存到其他路径 $img->save('images/new_avatar.jpg'); /* 上面的逻辑可以通过链式表达式搞定 */ $img = Image::make('images/avatar.jpg')->resize(200, 200)->insert('images/new_avatar.jpg', 'bottom-right', 15, 10)->save('images/new_avatar.jpg'); 2、上传图片生成数据流,不保存图片 $image = (string)Image::make($image)->resize(500,500)->encode('png', 75); $base64_encode = 'data:image/png;base64,' . base64_encode($image); return ''; 3、生成图片,不保存 $image = (string)\Image::make($image)->resize(500,500)->encode('png', 75); $image = \Response::make($image); return $image->header('Content-Type', 'image/png');
4,具体使用
4. 具体用法 改变图像尺寸的方法: resize() widen() heighten() fit() resizeCanvas() crop() trim() 调整图像的方法: gamma() brightness() contrast() colorize() greyscale() invert() mask() flip() 应用效果的方法: filter() pixelate() rotate() blur() 绘画的方法: text() pixel() line() rectangle() circle() ellipse() 检索信息的方法: width() height() mime() exif() iptc() 输出图像数据的方法: encode() save() response()
另外 图片旋转 orientate()方法 需要php开启 exif扩展
额外附带上一个应用实例 海报生成(图片合成tp代码)
use Intervention\Image\ImageManagerStatic as Image; //thinkphp 下没有这个门面,容器 所以我们这里需要引入使用 /** * 测试生成海报 * @return string */ public function testImage(){ //字体文件 $fontPath = PUBLIC_PATH.'font'.DS.'fei.ttf'; //海报路径 $poster_url = PUBLIC_PATH.'static'.DS.'hai.jpg'; //海报为底图 $img = Image::make($poster_url); //微信头像路径 // $avatar_img = 'https://avatar.csdnimg.cn/F/4/8/3_weixin_46044420.jpg'; $avatar_img = PUBLIC_PATH.'static'.DS.'test.jpg'; //获取微信圆形头像 $touxiang = $this->circular_img($this->resize_img($avatar_img)); //拼接头像地址 $head_img = PUBLIC_PATH.$touxiang; //第一个参数头像地址,第二个参数头像显示位置 后两个参数为头像坐标 $img->insert($head_img, 'bottom-left', 35, 30); //二维码地址 $code_img =PUBLIC_PATH.'static'.DS.'qrcode.png'; $img->insert($code_img , 'bottom-right', 35, 30); //微信昵称 $img->text('昵称昵称', 180, 50, function ($font) use($fontPath) { $font->file($fontPath); $font->size(30); $font->align('center'); $font->color('#B47331'); }); // 其他文字 $img->text('▲扫码了解', 100, 300, function ($font) use ($fontPath) { $font->file($fontPath); $font->size(50); $font->color('#222A2C'); $font->align('left'); }); $img->text('The quick brown fox jumps over the lazy dog.', 120, 200); unlink($head_img);//删除圆形微信头像 /*** //图片地址 $img_src = PUBLIC_PATH . 'upload'. DS .time().'.jpg'; //生成 $img->save($img_src); return $img_src; ***/ /*** //图片生成数据流,不保存图片 $image = (string) $img->encode('data-url'); return $image; ***/ //图片生成数据流,不保存图片 $image = (string) $img->encode('png', 75); $base64_encode = 'data:image/png;base64,' . base64_encode($image); return $base64_encode; } /** * 图片变圆方法(微信头像) * @param string $url 图片路径+名 * @param string $path 生成图片存储路径 * @return string 生成的图片路径+名 */ public function circular_img($url,$path='upload/images/'){ $w = 110; $h=110; // original size 微信默认头像大小 高132,宽132 $original_path= $url; $dest_path = $path.uniqid().'.jpg'; //没有就创建目录 if(!file_exists($path)) { mkdir($path,0777,true); } $src = imagecreatefromstring(file_get_contents($original_path)); //创建画布 $newpic = imagecreatetruecolor($w,$h); //关闭混色模式 imagealphablending($newpic,false); //为一幅图像分配颜色和透明度 url,red,green,blue,alpha(透明度参数,其值从 0 到 127;0 表示完全不透明,127 表示完全透明) $transparent = imagecolorallocatealpha($newpic, 0, 0, 0, 127); $r=$w/2; for($x=0;$x<$w;$x++) for($y=0;$y<$h;$y++){ $c = imagecolorat($src,$x,$y);//取得某像素的颜色索引值 $_x = $x - $w/2; $_y = $y - $h/2; if((($_x*$_x) + ($_y*$_y)) < ($r*$r)){ imagesetpixel($newpic,$x,$y,$c);//画一个单一像素 }else{ imagesetpixel($newpic,$x,$y,$transparent); } } //设置标记以在保存 PNG 图像时保存完整的 alpha 通道信息(与单一透明色相反) imagesavealpha($newpic, true); // 保存图像 png 格式 imagepng($newpic, $dest_path); imagedestroy($newpic); imagedestroy($src); unlink($url); return $dest_path; } /** * 图片压缩到指定(110)尺寸 * @param string $url 图片路径+名 * @param string $path 生成图片存储路径 * @return string 生成的图片路径+名 */ public function resize_img($url,$path='upload/images/'){ $imgname = $path.uniqid().'.jpg'; $file = $url; $fileinfo = getimagesize($url);//获取原图尺寸(获取图像信息) $width = $fileinfo[0]; $height = $fileinfo[1]; $percent = (110/$width); //缩放尺寸 $newwidth = $width * $percent; $newheight = $height * $percent; switch($fileinfo['mime'])//判断图片类型 { case "image/png": $src_im=imagecreatefrompng($file);//用于从文件或 URL 载入一幅图像 break; case "image/jpeg": case "image/jpg": $src_im=imagecreatefromjpeg($file); break; case "image/gif": $src_im=imagecreatefromgif($file); break; default: return false; } $dst_im = imagecreatetruecolor($newwidth, $newheight); //拷贝图像或图像的一部分并调整大小(生成图片的缩略图) imagecopyresized($dst_im, $src_im, 0, 0, 0, 0, $newwidth, $newheight, $width, $height); imagejpeg($dst_im, $imgname); //输出压缩后的图片 imagedestroy($dst_im); imagedestroy($src_im); return $imgname; }