laravel 使用 Intervention/image 进行图片处理

作者: hgphp 发布时间: 2022-10-04 浏览: 2423 次 编辑

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