图片处理扩展 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) 大小,字体大小仅在设置字体文件时可用,否则将被忽略, 默认值:12color($color) 颜色align($align) 水平对齐方式:left、right、center,默认leftvalign($valign) 垂直对齐方式:top、bottom、middle,默认bottomangle($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库)object Intervention\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 编码的图片数据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 框架自带的图片上传实例 |
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年前 自动加精
推荐文章: