Измените размер изображения с помощью библиотеки PHP vips.

Я использую библиотеку PHP imagick и PHP vips для операций с изображениями. Я работаю над операцией изменения размера изображения. Для imagick я использую функцию resizeImage(), а для vips я использую функцию resize(). Но вывод обоих изображений различен для одинаковой высоты и ширины. Я хочу такой же вывод для VIP-персон. Здесь я добавляю свой код, который я использую для vips. Я хочу такой же результат и для випов, которые я получил в imagick

<!-- Imagick Code -->
$img = new Imagick($ipFile); 
$img->resizeImage(1000, 1000, Imagick::FILTER_LANCZOS, 1, true);
$img->writeimage($opFile);

<!-- VIPS Code -->
$im = Vips\Image::newFromFile($ipFile);
$im = $im->resize($ratio, ['kernel' => 'lanczos2']);
$im->writeToFile($opFile);

Выходной файл Vips:
Выходной файл Vips Выходной файл Imagick:
Выходной файл Imagick


person Amv    schedule 31.08.2020    source источник


Ответы (1)


Не используйте resize с php-vips, если вам это действительно не нужно. Вы получите лучшее качество, лучшую скорость и меньшее использование памяти с thumbnail.

Операция thumbnail сочетает в себе загрузку и изменение размера, поэтому она может использовать такие приемы, как сжатие при загрузке. Он знает о прозрачности, поэтому правильно изменит размер PNG. Он также знает о векторных форматах, таких как PDF и SVG, и подберет для них оптимальный размер.

Пытаться:

<!-- VIPS Code -->
$im = Vips\Image::thumbnail($ipFile, 1000);
$im->writeToFile($opFile);

Ориентир:

$ /usr/bin/time -f %M:%e convert ~/pics/nina.jpg -resize 1000x1000 x.jpg
238836:0.77
$ /usr/bin/time -f %M:%e vips resize ~/pics/nina.jpg x.jpg .1653439153
60996:0.39
$ /usr/bin/time -f %M:%e vips thumbnail ~/pics/nina.jpg x.jpg 1000
49148:0.16

nina.jpg – это изображение формата 6k x 4k RGB в формате JPG.

  • imagick изменяет размеры за 770 мс и 240 МБ памяти
  • vips resize занимает 390 мс и 61 МБ памяти
  • vips thumbnail занимает 160 мс и 50 МБ памяти

Качество в этом случае будет одинаковым.

person jcupitt    schedule 31.08.2020
comment
Спасибо за помощь. Нужна еще одна помощь, которую imagick предоставляет Imagick::FILTER_LANCZOS для применения фильтра, а также есть одна опция размытия в опции изменения размера, как я могу добиться этого с помощью vips? - person Amv; 31.08.2020
comment
libvips thumbnail использует lanczos3. - person jcupitt; 31.08.2020
comment
Есть ли способ изменить lanczos3? - person Amv; 31.08.2020
comment
Предполагается, что thumbnail реализует лучшие практики, поэтому вариантов очень мало. Зачем вам другое ядро? - person jcupitt; 31.08.2020
comment
Немного запутался в фильтрах, теперь понял, и мне не нужно менять ядро. Спасибо вам за помощь - person Amv; 31.08.2020
comment
Еще одна вещь: функция Imagick::getImageBlob() — это встроенная функция в PHP, которая используется для получения последовательности изображений в виде большого двоичного объекта. Я хочу сделать то же самое для vips, есть ли для этого аналогичный метод? - person Amv; 31.08.2020
comment
Да, $str = $image->writeToBuffer('.jpg');, см. libvips.github.io /php-vips/docs/классы/ - person jcupitt; 31.08.2020
comment
Я обрезаю изображение, используя приведенный ниже метод php vips $im = $im-›crop(87, 98, 530, 352); Я получаю сообщение об ошибке "Плохая область извлечения", не знаю, почему эта ошибка возникла. Есть ли способ предотвратить это? - person Amv; 02.09.2020
comment
Это crop(left, top, width, height). Вы запрашиваете область за пределами краев изображения. - person jcupitt; 02.09.2020