Класс обработки изображений
Класс обработки изображений CodeIgniter позволяет выполнять следующие действия:
- Изменение размера изображения
- Создание миниатюр
- Обрезка изображения
- Поворот изображения
- Водяные знаки на изображении
Поддерживаются следующие библиотеки обработки изображений: GD/GD2 и ImageMagick.
Инициализация класса
Как и большинство других классов в CodeIgniter, класс обработки изображений инициализируется в контроллере с помощью вызова класса сервисов:
$image = \Config\Services::image();
Вы можете передать псевдоним библиотеки обработки изображений, которую вы хотите использовать, в функцию сервиса:
$image = Config\Services::image('imagick');
Доступные обработчики:
- gd Библиотека обработки изображений GD/GD2
- imagick Библиотека ImageMagick.
Если вы используете библиотеку ImageMagick, необходимо установить путь к библиотеке на вашем сервере в файле app/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');
Вышеприведенный код сообщает библиотеке искать изображение под названием mypic.jpg в папке source_image, затем создать новое изображение из него размером 100x100 пикселей с использованием библиотеки изображений GD2 и сохранить его в новый файл (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.
Качество изображения
save() может принимать дополнительный параметр $quality для изменения качества результирующего изображения. Значения варьируются от 0 до 100, при этом значение 90 является значением по умолчанию для фреймворка. Этот параметр применим только к изображениям JPEG и будет проигнорирован в противном случае:
$image = \Config\Services::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
Если вы хотите изменить только качество изображения без его обработки, необходимо включить ресурс изображения, иначе вы получите точную копию:
$image = \Config\Services::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, содержащее сообщение об ошибке. Хорошей практикой является перехват исключений, отображая ошибку при сбое, как показано ниже:
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();
}
Обрезка изображений
Изображения можно обрезать, оставляя только часть исходного изображения. Это часто используется при создании миниатюрных изображений, которые должны соответствовать определенному размеру/соотношению сторон. Это обрабатывается методом 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 = \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)
-
$imageType — одно из констант типов изображений PHP (см., например, https://www.php.net/manual/en/function.image-type-to-mime-type.php):
\Config\Services::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’.
Это предоставляет гораздо более простой способ обрезки, который всегда сохраняет соотношение сторон:
\Config\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 — синяя составляющая фонового цвета.
\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’.
\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 имеет значение true, размер, указанный $masterDim, останется прежним, а другой размер будет изменён для соответствия исходному соотношению сторон изображения.
\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 — количество градусов поворота. Допустимые значения: ‘90’, ‘180’, ‘270’.
Примечание
Хотя параметр $angle может принимать значение с плавающей точкой, он будет преобразован в целое число во время процесса. Если значение не равно одному из перечисленных выше трех значений, будет выброшено исключение CodeIgniterImagesImageException.
Добавление текстового водяного знака
Вы можете наложить текстовый водяной знак на изображение очень просто с помощью метода text(). Это полезно для размещения авторских прав, имён фотографов или просто для маркировки изображений как предварительных, чтобы они не использовались в окончательных продуктах других людей.
text(string $text, array $options = [])
Первый параметр — строка текста, который вы хотите отобразить. Второй параметр — массив параметров, позволяющих указать, как должен отображаться текст:
\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 Горизонтальное выравнивание: left, center, right
- vAlign Вертикальное выравнивание: top, middle, bottom
- hOffset Дополнительное смещение по оси x в пикселях
- vOffset Дополнительное смещение по оси y в пикселях
- fontPath Полный путь к шрифту TTF, который вы хотите использовать. Если не указано, будет использован системный шрифт.
- fontSize Размер шрифта. При использовании обработчика GD с системным шрифтом допустимые значения — от 1 до 5.
Примечание
Драйвер ImageMagick не распознаёт полный путь к шрифту (fontPath). Вместо этого, просто укажите имя одного из установленных системных шрифтов, который вы хотите использовать, например, Calibri.
© 2014–2020 British Columbia Institute of Technology
Licensed under the MIT License.
https://codeigniter.com/user_guide/libraries/images.html