1

我正在使用 Yii2 扩展程序Imagine,我需要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,则创建新的白色背景图像,然后将新图像居中
  • 保存图片
  • 完毕!
4

2 回答 2

2

另一个尝试: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);
于 2017-03-12T20:14:43.277 回答
0

不能只用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\imagine\Image::$thumbnailBackgroundColor 和 yii\imagine\Image::$thumbnailBackgroundAlpha 配置的背景。

于 2017-03-12T11:22:01.510 回答