图片处理扩展 Intervention/image 的简单使用

Intervention Image是一个开源的PHP图像处理和操作库。 它提供了一种创建,编辑和合成图像的简便且富有表现力的方式,并支持当前两个最常见的图像处理库GD Library和Imagick。
编写该类是为了使PHP图像操作更容易且更具表现力。 无论您是要创建图像缩略图,水印还是对大型图像文件进行格式化,Intervention Image都可以帮助您以最少的代码行轻松地管理每个任务。
该库遵循FIG标准PSR-2,以确保共享的PHP代码之间的高度互操作性,并且经过了完全的单元测试。

一、 环境要求

  • PHP >=5.4
  • Fileinfo Extension
  • GD Library (>=2.0)
  • Imagick PHP extension (>=6.5.7)

二、 安装及配置

  • composer 安装
composer require intervention/image
  • app/config/app.php 添加 providers 数组中添加如下代码:
/*
 * Package Service Providers...
 */
Intervention\Image\ImageServiceProvider::class,
  • app/config/app.php 添加 aliases 数组中添加如下代码:
'Image' => Intervention\Image\Facades\Image::class,
  • 发布扩展生成 config/image.php 配置文件
php artisan vendor:publish --provider="Intervention\Image\ImageServiceProviderLaravelRecent"
  • config/image.php 修改驱动为imagick
// Imagick 处理效果和效率比 GD 好
'driver' => 'imagick'

三、常用API 及用法

创建图像

  • canvas() 创建一个空的画布
public Intervention\Image\ImageManager canvas(integer $width, integer $height, [mixed $bgcolor])
参数 描述
width 宽度
height 高度
bgcolor 背景颜色(可选)
// 实例化一个空的 100*100 透明背景空 canvas 图像资源对象
$img =  Image::canvas(100, 100);  
// 实例化一个空的 100*100 背景色为 #ff0000  canvas 图像资源对象
$img =  Image::canvas(100,  100,  '#ff0000');
  • make() 从给定图片实例化新图像实例
public static Intervention\Image\ImageManager make(mixed $source)
参数 描述
source 该方法高度可变,可读取下面列出的所有输入类型:
string文件系统的图片路径,
string图片的URL地址(allow_url_fopen必须启用),
string 二进制图片数据,
string data-url编码的图片数据,
string base64编码的图片数据,
resource gd类型的PHP资源(当使用GD库),
object Imagick实例(当使用Imagick库),
object Intervention\Image\Image 实例,
object SplFileInfo instance (To handle Laravel file uploads via Symfony\Component\HttpFoundation\File\UploadedFile) laravel框架自带的图片上传实例
// 以 foo.jpg 资源文件实例化一个 Image 对象 
$img = Image::make('public/foo.jpg');

// 实例化一个 GD 创建的图象的 Image 对象
$img = Image::make(imagecreatefromjpeg('public/foo.jpg'));

// URL
$img = Image::make('http://example.com/example.jpg');

// 直接从 Laravel 文件上传资源实例化一个 Image 对象
$img = Image::make(Input::file('photo'));

改变图像尺寸的方法

  • resize() 调整当前图像的大小
public Intervention\Image\Image resize (integer $width, integer $height, [Closure $callback])
参数 描述
width 设定宽度
height 设定高度
callback 闭包回调函数(可选),aspectRatio()用于约束宽高比例,upsize()防止图像放大(如果调整宽度超过图像原始宽度时,就保持图像原始宽度不变)
// 将图像调整为固定大小
$img->resize(300, 200);
// 防止可能的尺寸变化
$img->resize(300, null, function ($constraint) {   
    $constraint->aspectRatio();   // 按比例调整图片大小
    $constraint->upsize();  // 这里如果宽度不足 300 时,保持原来尺寸
});
  • widen()按给定宽度按比例调整图像大小
public Intervention\Image\Image widen(integer $width, [Closure $callback])
参数 描述
width 设定宽度
callback 闭包回调函数(可选),upsize()防止不必要的图像放大
// 将图像宽度调整为 300px,注意:宽度缩放的时候,高度是按比例变化的
$img = Image::make('public/foo.jpg')->widen(300);

// 将图像宽度调整为 300px,如果调整宽度超过图像原始宽度时,就保持图像原始宽度不变
$img = Image::make('public/foo.jpg')->widen(300, function ($constraint) {
    $constraint->upsize();
});

heighten()widen() 功能类似

  • crop() 裁剪图像
public Intervention\Image\Image crop(int $width, int $height, [int $x, int $y])
参数 描述
width 裁剪矩形宽度
height 裁剪矩形高度
x 裁剪矩形左上角的X坐标。 默认情况下,矩形部分将在当前图像上居中
y 裁剪矩形左上角的Y坐标。 默认情况下,矩形部分将在当前图像上居中
$img = Image::make('public/foo.jpg');

// 将图像从坐标 (25, 25)为切口裁剪为 200 * 100 大小
$img->crop(200, 100, 25, 25);

$img->crop(200, 100);
  • fit() 以智能的方式,结合裁剪和调整来格式化图片,该方法将会自动找到给定的宽、高的最佳宽高比,裁剪并调整到给定尺寸
public Intervention.mage.mage fit( int $width, [ [int $height], [Closure $callback, [ string $position ]] ])
参数 描述
width 裁剪出最合适的宽高比后,图像的宽度将被调整为该宽度
height 裁剪出最合适的宽高比后,图像的高度将被调整为该高度(可选), 如果未给出高度,则方法将使用与宽度相同的值
callback 闭包回调函数(可选),upsize()防止不必要的图像放大
position 设置裁剪的位置(可选), 可选值:top-left、 top、top-right 、left、center (default)、right、bottom-left 、bottom、bottom-right
$img = Image::make('public/foo.jpg');

// 按照 1:1 的比例裁剪,然后缩放大小为 100 * 100
$img->fit(100);

// 按照 5:6 的比例裁剪,然后缩放大小为 100 * 120,并防止图片放大
$img->fit(100, 120, function ($constraint) {
    $constraint->upsize();
});
  • resizeCanvas() 调整图像的边界到给定的宽和高
public Intervention\Image\Image resizeCanvas (int $width, int $height, [string $anchor, [boolean $relative, [mixed $bgcolor]]])
参数 描述
width 绝对模式下图像的新宽度 或 相对模式下在原来图片尺寸上,添加或者减去给定的宽、高
height 绝对模式下图像的新高度,或相对模式下要从高度增加或减少的像素数量
anchor 设置要调整图像大小的位置。 例如,如果将锚点设置为左下角,则此边将被固定,并且会将width / height的值添加或减去到图像的右上角,可选值:top-left、 top、top-right 、left、center (默认)、right、bottom-left 、bottom、bottom-right
relative 确定调整大小将在相对模式下进行, 这意味着width或height的值将与图像的当前高度相加或相减, 默认值:false
bgcolor 图像新区域的背景色, 可以以不同的颜色格式传递背景色, 默认值:#ffffff,如果输出格式支持则透明
$img = Image::make('public/foo.jpg');
// 调整图像画布的大小为 300 * 200 
$img->resizeCanvas(300, 200);
// 只调整画布的宽度为 300 ,高度不变
$img->resizeCanvas(300, null);
// 从右下角开始来调整画布的大小为 300 * 200
$img->resizeCanvas(300, 200, 'bottom-right');
// 在相对模式下调整画布的大小为 以原始图片中心点为锚点 ,宽度增加 10 ,高度减少 10 
$img->resizeCanvas(10, -10, 'center', true,);
// 设置背景色
$img->resizeCanvas(1280, 720, 'center', false, 'ff00ff');

绘画的方法

  • text() 将文字写入到图片上
public Intervention\Image\Image text(string $text, [integer $x, [integer $y, [Closure $callback]]])
参数 描述
text 要写入的文字
x 定义写入文字第一个字符基点的 X 坐标(可选), 默认值:0
y 定义写入文字第一个字符基点的 Y 坐标(可选), 默认值:0
callback 回调函数(可选):
file($filepath) 设置字体文件的路径或GD 库内部字体,范围1到5之间的整数值,默认值1
size($size) 大小,字体大小仅在设置字体文件时可用,否则将被忽略, 默认值:12
color($color)颜色
align($align)水平对齐方式:left、right、center,默认left
valign($valign)垂直对齐方式:top、bottom、middle,默认bottom
angle($angle)旋转角度,文本将围绕垂直和水平对齐点逆时针旋转, 旋转仅在设置字体文件时可用,否则将被忽略
$img = Image::make(''public/foo.png');

$img->text('测试文字', 50,50, function($font) {
    $font->file('public/Alibaba-PuHuiTi-Light.ttf');
    $font->size(24);
    $font->color('#000');
    //$font->align('center');
    //$font->valign('top');
    //$font->angle(45);
});
  • pixel() 绘制点( 在给定的坐标上,以给定的颜色绘制单个像素点)
public Intervention\Image\Image pixel(mixed $color, integer $x, integer $y)
参数 描述
color 颜色
x X坐标
y Y坐标
$img = Image::canvas(100, 100, '#ddd');
// 绘制一个坐标为 (32, 32),颜色为蓝色的点
$img->pixel('#0000ff', 32, 32);
  • line() 绘制线
public Intervention\Image\Image line(int $x1, int $y1, int $x2, int $y2, [Closure $callback])
参数 描述
x1 起点的X坐标
y1 起点的Y坐标
x2 终点的X坐标
y2 终点的Y坐标
callback 回调函数( 可选 ):
color()设置颜色, 默认值:#000000
width()设置线条的宽度(GD驱动程序不提供该选项)默认值:1px
$img = Image::make('public/foo.jpg');
// 绘制一条起点坐标为(10, 145),终点坐标为(185, 145),宽度为 5px 的红色线
$img->line(10, 145, 185, 145, function($draw){
    $draw->color('#f00');
    $draw->width(1);
});                    
  • rectangle() 绘制矩形(左上角位于x,y点1,右下角位于x,y点2)
public Intervention\Image\Image rectangle(int $x1, int $y1, int $x2, int $y2, [Closure $callback])
参数 描述
x1 矩形左上角点的X坐标
y1 矩形左上角点的Y坐标
x2 矩形右下角点的X坐标
y2 矩形右下角点的Y坐标
callback 回调定义整体外观(可选 ):
background($color) 设置背景色 ,border($width,$color) 设置矩形的边框
$img = Image::make('public/foo.jpg');
// 绘制左上角点坐标为 (5, 95) 右下角点坐标 (190, 143) ,边框宽度为 2px颜色为红色 ,背景色为红色的矩形
$img->rectangle(5, 95, 190, 143, function($draw){
  //$draw->background('#FFF');
  $draw->border(2, '#f00');
});
  • circle() 绘制圆
public Intervention\Image\Image circle( integer $diameter, integer $x, integer $y, [Closure $callback] )
参数 描述
diameter 直径
pos_x 圆心X坐标
pos_y 圆心Y坐标
callback 回调定义整体外观 (可选 ):
background($color) 设置背景色
border($width, $color)设置边的宽度和颜色
$img = Image::canvas(300, 200, '#ddd');
// 绘制一个半径为 10px,圆心坐标为 (100, 100),边框宽度为 1px ,边框颜色为红色,并填充颜色为蓝色的圆
$img->circle(10, 100, 100, function ($draw) {
    $draw->background('#0000ff');
    $draw->border(1, '#f00');
});
  • ellipse() 绘制椭圆
public Intervention\Image\Image ellipse(int $width, int $height, int $x, int $y, [Closure $callback])
参数 描述
width 椭圆的宽度, 默认值:10
height 椭圆高度, 默认值:10
x 中心点的 X 坐标
y 中心点的 Y 坐标
callback 回调定义整体外观(可选 ):
background($color) 设置背景色,border($width, $color)设置边的宽度和颜色
$img = Image::make('public/foo.jpg');
// 绘制宽度为 200,高度为 80,中心点为 (100, 118),边框宽度为 1px 颜色为红色,背景色为蓝色的椭圆
$img->ellipse(200, 80, 100, 118, function ($draw) {
   // $draw->background('#0000ff');
    $draw->border(1, '#ff0000');
});

*polygon() 绘制多边形

public Intervention\Image\Image polygon(array $points, [Closure $callback])
参数 描述
points 各个角的坐标,格式为一维数组 ,例如[ 0, 0, 1100, 0, 1100, 250]
callback 回调定义整体外观(可选 ):
background($color) 设置背景色,
border($width, $color)设置边的宽度和颜色
$img = Image::canvas(800, 600, '#ddd');
// 绘制一个边框为红色,填充背景色为蓝色的多边形
$img->polygon([
      0, 0, 
      1100, 0, 
      1100, 250
], function ($draw) {
    $draw->background('#0000ff');
    $draw->border(1, '#ff0000');
});

图像的其它处理方法

  • fill() 用颜色或图案填充图像
public Intervention\Image\Image fill(mixed $filling, [integer $x, integer $y])
参数 描述
filling 填充颜色或图像,图像资源格式如下:
string文件系统的图片路径
string图片的 URL 地址(allow_url_fopen必须启用)
string二进制图片数据
string data-url 编码的图片数据
string base64 编码的图片数据
resource gd 类型的 PHP 资源(当使用 GD 库)
object Imagick 实例(当使用Imagick库)
objectIntervention\Image\Image 实例
object SplFileInfo instance (To handle Laravel file uploads via Symfony\Component\HttpFoundation\File\UploadedFile) laravel 框架自带的图片上传实例
x 填充起始点的X轴坐标(可选)
y 填充起始点的Y轴坐标(可选)

如果指定了x、y坐标,则将基于此位置的颜色来填充,未指定坐标时填充整个图像
图形学中Flood Fill是 漫水填充,是用来填充区域的。就好比在一个地方一直倒水,水会往四周满延开,直到高地阻挡。Flood Fill就是从一个点开始往四周寻找相同的点填充,直到有不同的点为止。

$img = Image::canvas(800, 600);
// 用 #cccccc 填充图像
$img->fill('#cccccc');
//  用 tile.png 填充图像
$img->fill('tile.png');
// flood fill 填充
$img->fill('#ff00ff', 0, 0);
  • insert() 插入图片
public Intervention\Image\Image insert(mixed $source, [string $position, [integer $x, integer $y]])
参数 描述
source 要插入的图像, 该方法可以处理以下类型的输入:
string文件系统的图片路径
string图片的URL 地址(allow_url_fopen必须启用)
string二进制图片数据
string data-url 编码的图片数据
stringbase64编码的图片数据
resource gd 类型的 PHP 资源(当使用 GD 库)
object Imagick 实例(当使用 Imagick 库)
object Intervention\Image\Image 实例
objectSplFileInfo instance (To handle Laravel file uploads via Symfony\Component\HttpFoundation\File\UploadedFile) laravel 框架自带的图片上传实例
position 插入图像的位置(可选),参数:
top-left (默认)
top
top-right
left
center
right
bottom-left
bottom
bottom-right
x X 偏移坐标 默认值:0(可选)
y Y 偏移坐标 默认值:0(可选)
$img = Image::make('public/foo.jpg');
// 在右下角插入10像素偏移量的水印
$img->insert('public/watermark.png', 'bottom-right', 10, 10);

获取图像信息常用的方法

  • width() 获取图像宽度
// 获取图像的宽度
$width = Image::make('public/foo.jpg')->width();

height() 功能和 width() 类比

输出图像数据的方法

  • save() 保存图像,可指定路径和图像质量
  • public Intervention\Image\Image save([string $path, [int $quality], [string $format]])
参数 描述
path 设置图像保存路径(可选),如果图像是从一个存在的文件路径创建的,同时我们未指定 $path,将会尝试覆盖该路径
quality 设置图像质量(可选)范围从0(质量差,小文件)到100(最佳质量,大文件), 仅当JPG格式时有用,因为PNG压缩是无损的,并且不会影响图像质量, 默认值为90
format 设置图像将被保存的格式(可选)
$img = Image::make('public/foo.jpg')->resize(300, 200);
$img->save('public/foo', 80, 'jpg');
  • response() 直接作为HTTP响应
public Intervention\Image\Image response([string $format, [integer $quality]])
参数 描述
format 设置图像的格式( 可选),jpg、png、gif、tif、bmp,默认是jpeg
quality 设置图像质量( 可选,范围从0(质量差,小文件)到100(最佳质量,大文件), 仅当JPG格式时有用,因为PNG压缩是无损的,并且不会影响图像质量, 默认值为90
$img = Image::canvas(800, 600, '#ff0000');
// 直接输出
echo $img->response();
  • encode() 图像进行编码
public Intervention\Image\Image encode([mixed $format, [int $quality]])
参数 描述
format 编码格式( 可选): jpg、png、gif、tif、bmp、data-url(base64)。默认返回的编码后的数据。默认类型是 jpeg
quality 设置图像质量( 可选),范围从0(质量差,小文件)到100(最佳质量,大文件), 仅当JPG格式时有用,因为PNG压缩是无损的,并且不会影响图像质量, 默认值为90
// 将 png 格式图像编码为 jpg 格式
$jpg = (string) Image::make('public/foo.png')->encode('jpg', 75);
// 将图像编码为base64 格式
$data = (string) Image::make('public/bar.png')->encode('data-url');
本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 2年前 自动加精
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 7

有 text 换行功能的思路么😂

4年前 评论
社会主义接班人 (楼主) 4年前
wangxi

好像没有字体加粗

3年前 评论
surest 2年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!