私はyii2でこのコードを手に入れました:
Image::thumbnail($path, 100, 100)->save($thumbnail, ['quality' => 50]);
元画像の縦横比を保ったままリサイズしてくれると思いました。しかし、それはボックスを作成するだけです...何が問題なのですか?
私はyii2でこのコードを手に入れました:
Image::thumbnail($path, 100, 100)->save($thumbnail, ['quality' => 50]);
元画像の縦横比を保ったままリサイズしてくれると思いました。しかし、それはボックスを作成するだけです...何が問題なのですか?
あなたはそのように使うことができます:
use Imagine\Image\Box;
Image::frame($path)
->thumbnail(new Box(100, 100))
->save($thumbnail, ['quality' => 50]);
私は Yii2 でこのように使用していますが、正常に動作します。また、幅に関連するアスペクト比を完璧に保ちます。
use yii\imagine\Image;
use Imagine\Image\Box;
...
$imagine = Image::getImagine()
->open($resizeImagePath)
->thumbnail(new Box(120, 120))
->save($thumbnailImagePath, ['quality' => 90]);
画像の縦横比を維持するための簡単なコードを作成しました。
use yii\imagine\Image;
................................................................... ...............
public function doResize($imageLocation, $imageDestination, Array $options = null)
{
$newWidth = $newHeight = 0;
list($width, $height) = getimagesize($imageLocation);
if(isset($options['newWidth']) || isset($options['newHeight']))
{
if(isset($options['newWidth']) && isset($options['newHeight']))
{
$newWidth = $options['newWidth'];
$newHeight = $options['newHeight'];
}
else if(isset($options['newWidth']))
{
$deviationPercentage = (($width - $options['newWidth']) / (0.01 * $width)) / 100;
$newWidth = $options['newWidth'];
$newHeight = $height - ($height * $deviationPercentage);
}
else
{
$deviationPercentage = (($height - $options['newHeight']) / (0.01 * $height)) / 100;
$newWidth = $width - ($width * $deviationPercentage);
$newHeight = $options['newHeight'];
}
}
else
{
// reduce image size up to 20% by default
$reduceRatio = isset($options['reduceRatio']) ? $options['reduceRatio'] : 20;
$newWidth = $width * ((100 - $reduceRatio) / 100);
$newHeight = $height * ((100 - $reduceRatio) / 100);
}
return Image::thumbnail(
$imageLocation,
(int) $newWidth,
(int) $newHeight
)->save(
$imageDestination,
['quality' => isset($options['quality']) ? $options['quality'] : 100]
);
}
次のように使用できます。
(new TheClass)->doResize($imageLocation, $imageDestination, [
'quality' => 70,
'reduceRatio' => 50
]);
// or like this
(new TheClass)->doResize($imageLocation, $imageDestination, [
'quality' => 70,
'width' => 500,
]);
// or like this
(new TheClass)->doResize($imageLocation, $imageDestination, [
'quality' => 70,
'height' => 500,
]);
// and like this (but will break the aspect ratio)
(new TheClass)->doResize($imageLocation, $imageDestination, [
'quality' => 70,
'width' => 100
'height' => 500,
]);