图像处理类
CodeIgniter 的图像处理类允许你执行以下操作:
- 图像缩放 
- 缩略图创建 
- 图像裁剪 
- 图像旋转 
- 图像添加水印 
支持以下图像库:GD/GD2 和 ImageMagick。
初始化类
与 CodeIgniter 中的其他大多数类一样,在控制器中通过调用全局函数 service() 来初始化图像类:
<?php
$image = service('image');
你可以将你希望使用的图像库的别名传递给全局函数 service():
<?php
$image = service('image', 'imagick');
可用的处理程序如下:
- gdGD/GD2 图像库
- imagickImageMagick 库。
如果使用 ImageMagick 库,必须在 app/Config/Images.php 中设置库的路径。
备注
ImageMagick 处理程序需要 imagick 扩展。
处理图像
无论你想执行的处理类型(调整大小、裁剪、旋转或添加水印),过程都是相同的。你将设置与你计划执行的操作相对应的一些首选项,然后调用可用的处理函数之一。
例如,要创建图像缩略图,你将执行以下操作:
<?php
$image->withFile('/path/to/image/mypic.jpg')
    ->fit(100, 100, 'center')
    ->save('/path/to/image/mypic_thumb.jpg');
上面的代码告诉库去寻找一个名为 mypic.jpg 的图像,该图像位于 /path/to/image 文件夹中,然后从中创建一个 100 x 100 像素的新图像,并将其保存到一个新文件 mypic_thumb.jpg 中。由于它使用了 fit() 方法,它将尝试根据所需的纵横比找到图像的最佳部分进行裁剪,然后裁剪并调整结果的大小。
在保存之前,可以通过尽可能多的可用方法对图像进行处理。原始图像保持不变,使用新的图像并通过每个方法传递,在之前的结果上叠加结果:
<?php
$image->withFile('/path/to/image/mypic.jpg')
    ->reorient()
    ->rotate(90)
    ->crop(100, 100, 0, 0)
    ->save('/path/to/image/mypic_thumb.jpg');
这个示例首先会修复任何移动手机方向问题,然后将图像旋转 90 度,然后从左上角开始裁剪结果为 100 x 100 像素的图像。结果将保存为缩略图。
备注
为了允许图像类执行任何处理,包含图像文件的文件夹必须具有写入权限。
备注
对于某些操作,图像处理可能需要相当多的服务器内存。如果在处理图像时遇到内存溢出错误,则可能需要限制它们的最大大小和/或调整 PHP 内存限制。
图像质量
save() 可以接受额外的参数 $quality 来更改结果图像的质量。值的范围从 0 到 100,默认值为 90。此参数仅适用于 JPEG 和 WebP 图像,否则将被忽略:
备注
自 v4.4.0 起,WebP 格式可以使用 $quality 参数。
<?php
$image->withFile('/path/to/image/mypic.jpg')
    // processing methods
    ->save('/path/to/image/my_low_quality_pic.jpg', 10);
备注
更高的质量会导致文件大小更大。另请参阅 https://www.php.net/manual/en/function.imagejpeg.php
如果你只对更改图像质量而不做任何处理感兴趣。你需要包含图像资源,否则最终会得到一个完全相同的副本:
<?php
$image->withFile('/path/to/image/mypic.jpg')
    ->withResource()
    ->save('/path/to/image/my_low_quality_pic.jpg', 10);
处理方法
有 8 种可用的处理方法:
- $image->crop()
- $image->convert()
- $image->fit()
- $image->flatten()
- $image->flip()
- $image->resize()
- $image->rotate()
- $image->text()
这些方法返回类实例,所以它们可以链式调用,如上所示。如果它们失败,它们将抛出一个包含错误消息的 CodeIgniter\Images\ImageException。一个好的做法是捕获异常,在失败时显示错误,像这样:
<?php
$image = service('image');
try {
    $image->withFile('/path/to/image/mypic.jpg')
        ->fit(100, 100, 'center')
        ->save('/path/to/image/mypic_thumb.jpg');
} catch (\CodeIgniter\Images\Exceptions\ImageException $e) {
    echo $e->getMessage();
}
裁剪图像
可以裁剪图像,使只保留原始图像的一部分。这通常用于在必须与某个大小/纵横比匹配时创建缩略图图像。这是通过 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'。
要从图像中心取一个 50 x 50 像素的正方形,你需要首先计算适当的 x 和 y 偏移值:
<?php
$info = service('image', 'imagick')
    ->withFile('/path/to/image/mypic.jpg')
    ->getFile()
    ->getProperties(true);
$xOffset = ($info['width'] / 2) - 25;
$yOffset = ($info['height'] / 2) - 25;
service('image', 'imagick')
    ->withFile('/path/to/image/mypic.jpg')
    ->crop(50, 50, $xOffset, $yOffset)
    ->save('/path/to/new/image.jpg');
转换图像
convert() 方法更改库的内部指示器,以获得所需的文件格式。这不会触及实际的图像资源,而是向 save() 指示要使用的格式:
convert(int $imageType)
- $imageType是 PHP 的图像类型常量之一(参见例如 https://www.php.net/manual/en/function.image-type-to-mime-type.php):- <?php service('image') ->withFile('/path/to/image/mypic.jpg') ->convert(IMAGETYPE_PNG) ->save('/path/to/new/image.png'); 
备注
ImageMagick 已经以扩展名指示的类型保存文件,忽略 $imageType。
调整图像大小
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'。
这提供了一种更简单的裁剪方式,将始终保持纵横比:
<?php
service('image', 'imagick')
    ->withFile('/path/to/image/mypic.jpg')
    ->fit(100, 150, 'left')
    ->save('/path/to/new/image.jpg');
扁平化图像
flatten() 方法旨在为透明图像(PNG)添加背景色,并将 RGBA 像素转换为 RGB 像素
- 将透明图像转换为 jpg 时指定背景色。 
flatten(int $red = 255, int $green = 255, int $blue = 255)
- $red是背景的红色值。
- $green是背景的绿色值。
- $blue是背景的蓝色值。
<?php
service('image', 'imagick')
    ->withFile('/path/to/image/mypic.png')
    ->flatten()
    ->save('/path/to/new/image.jpg');
service('image', 'imagick')
    ->withFile('/path/to/image/mypic.png')
    ->flatten(25, 25, 112)
    ->save('/path/to/new/image.jpg');
翻转图像
可以沿着水平或垂直轴翻转图像:
flip(string $dir)
- $dir指定要翻转的轴。可以是- 'vertical'或- 'horizontal'。
<?php
service('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指定在保持比例时应遵守哪个轴的尺寸。可以是- 'width'、- 'height'。
在调整图像大小时,你可以选择是保持原始图像的比例,还是拉伸/挤压新图像以适应所需尺寸。如果 $maintainRatio 为 true, $masterDim 指定的维度将保持不变,而另一维度将改变以匹配原始图像的纵横比。
<?php
service('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 参数接受浮点数,但在处理过程中它会将其转换为整数。如果值与上面列出的三个值之一不同,它将抛出一个 CodeIgniterImagesImageException。
添加文本水印
你可以使用 text() 方法非常简单地在图像上覆盖文本水印。这对于放置版权声明、摄影师姓名或简单地将图像标记为预览很有用,这样它们就不会在其他人的最终产品中使用。
text(string $text, array $options = [])
第一个参数是你希望显示的文本字符串。第二个参数是一个选项数组,允许你指定文本的显示方式:
<?php
service('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水平对齐:- 'left',- 'center',- 'right'
- vAlign垂直对齐:- 'top',- 'middle',- 'bottom'
- hOffsetx 轴上的额外偏移,以像素为单位
- vOffsety 轴上的额外偏移,以像素为单位
- fontPath你要使用的 TTF 字体的完整服务器路径。如果没有给出,则使用系统字体。
- fontSize要使用的字体大小。对于使用系统字体的 GD 处理程序,有效值为- 1到- 5之间。
备注
ImageMagick 驱动程序不识别字体路径的完整服务器路径。相反,只提供你希望使用的已安装系统字体的名称,例如 Calibri。