Обрезка изображения из центра в самый большой квадрат, который вы можете сделать в Yii2.

Я использую расширение Yii2 Представить и мне нужно сделать 150x150 изображения из пользовательских загрузок.

В настоящее время я просто делаю что-то вроде этого:

use yii\imagine\Image;

....

Image::thumbnail($save_path, $img_size, $img_size)->save($save_path);

Очевидно, что это может вызвать проблемы, если одно из измерений < 150px после изменения размера

Так что я пытаюсь выяснить, в первую очередь, как обрезать изображение в площадь до он изменен, так что, когда я изменю его размер, не будет никакого соотношение сторон проблемы.

Теперь я знаю, что вы можете обрезать изображение с помощью чего-то вроде:

Image::crop($save_path, $img_size, $img_size, [5, 5]);

Но проблема в этом до изменение размера изображения, скорее всего, не даст вам того, что вы хотите, так как изображение может быть таким большим и обрезать его после изменение размера не будет работать, так как одно измерение, возможно, уже было уменьшено до < 150px,

Так что я пытаюсь понять, как я могу обрезать изображение до изменение размера до максимальная размер площади возможен а также из центра наружу?

Редактировать:

Хорошо, я разработал способ справиться с этим, но мне было интересно, есть ли какой-либо способ легко выполнить нижеприведенное, или мне нужно будет самому его кодировать?

  • Выберите наименьшее измерение (ширина или высота)
  • Затем возьмите это измерение, и это будет самый большой квадрат, который вы можете иметь
  • Выясните, как расположить это в центре для урожая
  • Теперь вы можете сделать изменение размера
  • Если после изменения размера какая-либо из сторон меньше 150, создайте новое белое фоновое изображение, а затем отцентрируйте новое изображение на этом
  • Сохранить изображение
  • Готово!

0

Решение

Еще одна попытка: p

<?php

use yii\imagine\Image;
use Imagine\Image\Box;
use Imagine\Image\Point;

// ...

$thumbnail = Image::thumbnail($save_path, $img_size, $img_size);
$size = $thumbnail->getSize();
if ($size->getWidth() < $img_size or $size->getHeight() < $img_size) {
$white = Image::getImagine()->create(new Box($img_size, $img_size));
$thumbnail = $white->paste($thumbnail, new Point($img_size / 2 - $size->getWidth() / 2, $img_size / 2 - $size->getHeight() / 2));
}
$thumbnail->save($save_path);
1

Другие решения

Разве вы не можете просто использовать четвертый параметр Image :: thumbnail ()?

Image::thumbnail($save_path, $img_size, $img_size, Image\ImageInterface::THUMBNAIL_INSET)->save($save_path);

От http://www.yiiframework.com/doc-2.0/yii-imagine-baseimage.html#thumbnail()-detail:

Если режим миниатюр — ImageInterface :: THUMBNAIL_INSET, оригинал
изображение уменьшено, поэтому оно полностью содержится в миниатюре
размеры. Остальное заполнено фоном, который может быть
настраивается через yii \ воображать \ Image :: $ thumbnailBackgroundColor и
юй \ представьте \ Image :: $ thumbnailBackgroundAlpha.

0

По вопросам рекламы [email protected]