CodeIgniter4 图像处理类
CodeIgniter的图像处理类允许你执行以下操作:
- 图像大小调整
- 创建缩略图
- 图像裁剪
- 图像旋转
- 图像水印
图像处理类支持使用以下图像库:GD/GD2和 ImageMagick
初始化类
与CodeIgniter中的大多数其他类一样,你可以通过控制器中调用Services类的初始化图像处理类:
$image = Config\Services::image();
你可以将要使用的图像库的别名传递给服务功能:
$image = Config\Services::image('imagick');
可用的图像库处理程序如下:
- gd 对应调用的是GD/GD2图像库。
- imagick 对应调用的是ImageMagick图像库。
如果你要使用ImageMagick图像库,则必须要在 application/Config/Images.php 中设置服务器上该库的所在路径。
注解
ImageMagick处理程序不需要在服务器上加载imagick扩展。只要你的脚本可以访问该库并且可以使用exec()
运行在服务器上,它就可以工作。
处理图像
无论你执行何种图像的处理方法函数(调整大小、裁剪、旋转、使用水印),一般调用过程都是相同的。 你将根据要执行的操作设置一些首选项,然后调用其中一个你需要的使用的可用处理函数:
$image = Config\Services::image()
->withFile('/path/to/image/mypic.jpg')
->fit(100, 100, 'center')
->save('/path/to/image/mypic_thumb.jpg');
上面的代码告我们它会查找来自image文件夹中的名为mypic.jpg的图像,然后使用GD2 image_library图像库来创建一个100 x 100像素的新图像,并将其保存到新文件(the thumb)。 由于它使用fit()方法,它将尝试根据所需的宽高比找到要裁剪的图像的最佳部分,然后裁剪并调整结果大小。
在保存新图像之前,可以根据需求来通过许多可用方法来处理图像。原始图像将保持原样,而新图像会通过每个方法传参,将处理结果应用于直接的结果之上:
$image = Config\Services::image()
->withFile('/path/to/image/mypic.jpg')
->reorient()
->rotate(90)
->crop(100, 100, 0, 0)
->save('/path/to/image/mypic_thumb.jpg');
此示例将采用相同的图像并首先修复任何移动电话的定向问题,图像将旋转90度,然后从左上角开始将结果裁剪为100x100像素图像。结果将保存成缩略图。
注解
为了让图像处理类可以进行任何处理,包含图像文件的文件夹必须具有写入权限。
对于某些操作,图像处理时可能需要相当大量的服务器内存。如果在处理图像时遇到内存不足错误,可能需要限制其图像的最大大小,和/或调整PHP内存限制。
处理方法
有六种可用的处理方法可以调用:
- $image->crop()
- $image->fit()
- $image->flatten()
- $image->flip()
- $image->resize()
- $image->rotate()
- $image->text()
这些方法将会返回类实例,如上所示,它们可以链接在一起。如果失败,它们将抛出包含错误的消息到 CodeIgniter\Images\ImageException
。 一个好的做法是捕获异常消息,在失败时显示错误,如下所示:
try {
$image = Config\Services::image()
->withFile('/path/to/image/mypic.jpg')
->fit(100, 100, 'center')
->save('/path/to/image/mypic_thumb.jpg');
}
catch (CodeIgniter\Images\ImageException $e)
{
echo $e->getMessage();
}
注解
你可以选择通过在函数中提交开始/结束标记来指定要应用于错误的HTML格式,如下所示:
$this-&image_lib-&display_errors('<p&', '</p&');
图像裁剪
图像可以被裁剪,只保留原始图像的一部分。通常用于创建特定大小/纵横比匹配的缩略图图像。这是用 crop()
方法处理的:
crop(int $width = null, int $height = null, int $x = null, int $y = null, bool $maintainRatio = false, string $masterDim = 'auto')
- $width 是结果图像的所需宽度,以像素为单位。
- $height 是结果图像的所需高度,以像素为单位。
- $x 是从图像左侧开始裁剪的像素数。
- $y 是从图像顶部开始裁剪的像素数。
- $maintainRatio 如果为true,将根据需要调整最终尺寸以保持图像的原始高宽比。
- $masterDim 可使其保持不变的维度,当$maintainRatio为true时。值可以是:’width’,’height’或’auto’。
要从图像中心取出50x50像素的正方形,你需要首先计算适当的x和y偏移值:
$info = Services::image('imagick')
->withFile('/path/to/image/mypic.jpg')
->getFile()
->getProperties(true);
$xOffset = ($info['width'] / 2) - 25;
$yOffset = ($info['height'] / 2) - 25;
Services::image('imagick')
->withFile('/path/to/image/mypic.jpg')
->crop(50, 50, $xOffset, $yOffset)
->save('path/to/new/image.jpg');
拟合图像
使用 fit()
方法旨在通过执行以下步骤帮助简化以“智能”方式裁剪图像的一部分:
- 确定要裁剪的原始图像的正确部分,以保持所需的宽高比。
- 裁剪原始图像。
- 调整大小到最终尺寸。
fit(int $width, int $height = null, string $position = 'center')
- $width 是图像的最终宽度。
- $height 是图像所需的最终高度。
- $position 确定要裁剪的图像部分。允许的位置: ‘top-left’, ‘top’, ‘top-right’, ‘left’, ‘center’, ‘right’, ‘bottom-left’, ‘bottom’, ‘bottom-right’。
这里提供一种更简单的裁剪方式,可以始终保持纵横比:
Services::image('imagick')
->withFile('/path/to/image/mypic.jpg')
->fit(100, 150, 'left')
->save('path/to/new/image.jpg');
展平图像
使用 flatten()
方法旨在在透明图像(PNG)后面添加背景颜色并将RGBA像素转换为RGB像素
- 从透明图像转换为jpgs格式时指定背景颜色。
flatten(int $red = 255, int $green = 255, int $blue = 255)
- $red 是背景的红色值。
- $green 是背景的绿色值。
- $blue 是背景的蓝色值。
Services::image('imagick')
->withFile('/path/to/image/mypic.png')
->flatten()
->save('path/to/new/image.jpg');
Services::image('imagick')
->withFile('/path/to/image/mypic.png')
->flatten(25,25,112)
->save('path/to/new/image.jpg');
翻转图像
图像可以沿水平轴或垂直轴翻转:
flip(string $dir)
- $dir 指定要翻转的轴。可以是“垂直”或“水平”。
Services::image('imagick')
->withFile('/path/to/image/mypic.jpg')
->flip('horizontal')
->save('path/to/new/image.jpg');
调整图像大小
可以使用resize()方法调整图像大小以适合你需要的任何维度:
resize(int $width, int $height, bool $maintainRatio = false, string $masterDim = 'auto')
- $width 是新图像的所需宽度(以像素为单位)
- $height 是新图像的所需高度(以像素为单位)
- $maintainRatio 确定图像是否被拉伸以适应新尺寸,或者是否保持原始宽高比。
- $masterDim 指定在保持比率时哪个轴应该具有其维度。’宽度’,’高度’。
调整图像大小时,你可以选择是保持原始图像的比例,还是拉伸/压缩新图像以适合所需的尺寸。 如果$maintainRatio为true,则$masterDim指定的尺寸将保持不变,而另一个尺寸将更改为与原始图像的纵横比相匹配。
Services::image('imagick')
->withFile('/path/to/image/mypic.jpg')
->resize(200, 100, true, 'height')
->save('path/to/new/image.jpg');
旋转图像
使用 rotate() 方法允许你以90度的增量旋转图像:
rotate(float $angle)
- $angle 是要旋转的度数。’90’,’180’,’270’之一。
注解
虽然$angle参数接受float,但它会在进程中将其转换为整数。 如果该值不是上面列出的三个值, 他会抛出一个自CodeIgniterImagesImageException的图像异常错误.
添加文本水印
你可以使用text()方法非常简单地将文本水印叠加到图像上。 这对于放置版权声明,摄影师名称或简单地将图像标记为预览非常有用,这会使它们最终不会用于其他人的产品上。
text(string $text, array $options = [])
第一个参数是你要显示的文本字符串。第二个参数是一个选项数组,允许你指定文本的显示方式:
Services::image('imagick')
->withFile('/path/to/image/mypic.jpg')
->text('Copyright 2017 My Photo Co', [
'color' => '#fff',
'opacity' => 0.5,
'withShadow' => true,
'hAlign' => 'center',
'vAlign' => 'bottom',
'fontSize' => 20
])
->save('path/to/new/image.jpg');
可识别的选项如下:
- color 文本颜色 (十六进制数字), 即#ff0000
- opacity 设置一个介于0到1之间的数字,表示文本的不透明度。
- withShadow 以布尔值是否来显示阴影。
- shadowColor 设定阴影的颜色(十六进制数)。
- shadowOffset 偏移阴影的像素数。适用于垂直和水平值。
- hAlign 水平对齐:左,中,右
- vAlign 垂直对齐:顶部,中间,底部
- hOffset 指定x轴上的附加偏移,以像素为单位
- vOffset 指定y轴上的附加偏移,以像素为单位
- fontPath 要使用的TTF字体的完整服务器路径。如果没有给出系统字体,将使用系统字体。
- fontSize 要使用的字体大小。将GD处理程序与系统字体一起使用时,有效值介于1-5之间。
注解
ImageMagick驱动程序无法识别fontPath的完整服务器路径。相反,需要你提供希望使用的已安装系统字体之一的名称,即如Calibri。