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;
}