Twitt
@Twitt

Как в Yii2 вывести обрезанную фотографию?

Добрый день!
Мне необходимо загружать фотографию, и на одной из страниц все фотографии должны быть одного размера, а уже при клике на одну из фотографий на другой странице уже она открывалась в оригинальном размере. Т.к. пользователи загружают изображения различных размеров, сейчас они выводятся то огромные, то маленькие, и получается не то что надо.
Нужно сделать, чтобы при загрузке на сервер фотографий было так:
либо загружаются две версии фотографии (original и crop) (соответственно в бд также сделать поля помимо одного - photo, разделить на original и crop),
либо нужно чтобы загружалась одна версия фотографии, и каким то образом в самой view, сделать каким-то методом Crop чтобы все фотографии которые будут на странице были одного кропнутого размера (например 640х640). Как лучше сделать, и каким расширением? Пробовал через Imagine
Image::crop(Yii::getAlias("@webroot") . '/images/2ab17480c5807726bdab3edd388e1ce0.jpg', 640, 640)
->save(Yii::getAlias('@webroot') . '/images/crop-photo.jpg');

Но тут оно обрезает фотку на базе существующей уже на сервере фотографии.
И буду очень благодарен, если подскажите, какой метод лучше (разделение на original и crop, или второй где во view мы вызвали бы метод crop).
Спасибо )
  • Вопрос задан
  • 433 просмотра
Решения вопроса 1
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
делают так:
обрезка обычно при загрузке, иногда делают при запросе фото, но там много подводных камней, так что советую именно при загрузке.
хранить в базе надо только название фото, а вот миниатюры просто раскиданы по папкам. Вариантов структуры папок много, вот первый пример:
echo '/images/originals/'.$model->imagename;  //оригиналы
echo '/images/small/'.$model->imagename;  //миниатюры

более гибкий вариант:
echo '/images/2017/07/original/'.$model->imagename;  //оригиналы
echo '/images/2017/07/400x400/'.$model->imagename;  //миниатюры 400x400
echo '/images/2017/07/1000x/'.$model->imagename;  //миниатюры 1000xauto
echo '/images/2017/07/x50/'.$model->imagename;  //миниатюры autox50

соответственно можно создать метод в моделе и юзать как-то так:
echo $model->getImageUrl('400x');
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
slo_nik
@slo_nik Куратор тега Yii
Добрый день.
Я бы не делал обрезку фото в представлении, зачем лишние движения?
При загрузке делаете два изображения, в таблице одно(!) поле для имени фото(основная часть имени, например image.jpg), а сохраняйте в директорию с именами original_image.jpg и crop_image.jpg.
Когда будете выводить фото в представлении подставляйте к имени или original или crop для вывода или оригинала или обрезанной фотографии.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы