图像处理类

CodeIgniter 的图像处理类允许您执行以下操作

  • 图像调整大小

  • 缩略图创建

  • 图像裁剪

  • 图像旋转

  • 图像水印

支持以下图像库:GD/GD2 和 ImageMagick。

初始化类

与 CodeIgniter 中的大多数其他类一样,图像类是在您的控制器中通过调用 Services 类来初始化的

<?php

$image = \Config\Services::image();

您可以将您希望使用的图像库的别名传递到 Service 函数中

<?php

$image = \Config\Services::image('imagick');

可用的处理程序如下

  • gd GD/GD2 图像库

  • imagick ImageMagick 库。

如果使用 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');

上面的代码告诉库在 source_image 文件夹中查找名为 mypic.jpg 的图像,然后使用 GD2 image_library 从中创建一个新的 100 x 100 像素的图像,并将其保存到一个新文件(缩略图)。由于它使用的是 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 度,然后将结果裁剪成 100x100 像素的图像,从左上角开始。结果将保存为缩略图。

注意

为了允许图像类执行任何处理,包含图像文件的文件夹必须具有写入权限。

注意

对于某些操作,图像处理可能需要大量的服务器内存。如果您在处理图像时遇到内存不足错误,您可能需要限制其最大大小,并/或调整 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://php.ac.cn/manual/en/function.imagejpeg.php

如果您只对更改图像质量而不进行任何处理感兴趣。您需要包含图像资源,否则您将得到一个完全相同的副本

<?php

$image->withFile('/path/to/image/mypic.jpg')
    ->withResource()
    ->save('/path/to/image/my_low_quality_pic.jpg', 10);

处理方法

有七种可用的处理方法

  • $image->crop()

  • $image->convert()

  • $image->fit()

  • $image->flatten()

  • $image->flip()

  • $image->resize()

  • $image->rotate()

  • $image->text()

这些方法返回类实例,因此可以像上面所示那样将它们链接在一起。如果它们失败,它们将抛出一个 CodeIgniter\Images\ImageException,其中包含错误消息。一个好的做法是捕获异常,在失败时显示错误,如下所示

<?php

$image = \Config\Services::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 如果为真,将根据需要调整最终尺寸以保持图像的原始纵横比。

  • $masterDim 指定当 $maintainRatio 为真时,应保持哪个维度不变。值可以是:'width''height''auto'

要从图像中心截取一个 50x50 像素的正方形,您需要先计算适当的 x 和 y 偏移值

<?php

$info = \Config\Services::image('imagick')
    ->withFile('/path/to/image/mypic.jpg')
    ->getFile()
    ->getProperties(true);

$xOffset = ($info['width'] / 2) - 25;
$yOffset = ($info['height'] / 2) - 25;

\Config\Services::image('imagick')
    ->withFile('/path/to/image/mypic.jpg')
    ->crop(50, 50, $xOffset, $yOffset)
    ->save('/path/to/new/image.jpg');

转换图像

convert() 方法更改库中用于所需文件格式的内部指示器。这不会触及实际的图像资源,而是指示 save() 使用什么格式

convert(int $imageType)

注意

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

\Config\Services::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

\Config\Services::image('imagick')
    ->withFile('/path/to/image/mypic.png')
    ->flatten()
    ->save('/path/to/new/image.jpg');

\Config\Services::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

\Config\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 指定在保持比例时哪个轴的尺寸应该保持不变。可以是 'width''height'

调整图像大小时,您可以选择是否保持原始图像的比例,或者将新图像拉伸/压缩以适应所需的尺寸。如果 $maintainRatio 为真,则由 $masterDim 指定的尺寸将保持不变,而另一个尺寸将被更改以匹配原始图像的纵横比。

<?php

\Config\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 是旋转的度数。可以是 90180270

注意

虽然 $angle 参数接受浮点数,但在处理过程中它会将其转换为整数。如果该值不是上面列出的三个值中的任何一个,它将抛出 CodeIgniterImagesImageException。

添加文字水印

您可以使用 text() 方法非常简单地将文字水印叠加到图像上。这对于放置版权声明、摄影师姓名或简单地将图像标记为预览以防止它们被用在其他人的最终产品中非常有用。

text(string $text, array $options = [])

第一个参数是要显示的文本字符串。第二个参数是一个选项数组,允许您指定文本的显示方式。

<?php

\Config\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。