web-dev-qa-db-ja.com

Laravelで介入画像を使用して元の比率を維持しながら、最大幅/高さでサイズ変更

元の比率を維持したまま、画像がどちらか最大寸法を超えた場合にのみ画像を拘束したいと思います。

それで、私のパラメータが600の最大の高さと幅であるとしましょう。

1000x1000の画像は600x600になり、十分に単純です。

2000x1000の画像は600x300になります。これは、2つの値の最大値が600になり、もう一方の値が比例して制約されることを意味します。

このようなもの

            $image->resize(600, 600, function ($constraint) {
                $constraint->aspectRatio();
            });

これについて行くための最良の方法は何でしょうか?

編集:

コメントによると、私はこれを試しました:

    $medium = Image::make($file);

    $medium->resize(null, 500, function ($constraint) {
        $constraint->aspectRatio();
    });

    $medium->resize(500, null, function ($constraint) {
        $constraint->aspectRatio();
    });             
    $medium->save( public_path('/uploads/artistUploads/medium-' . $filename , 90) );    

これは動作しません。最初のサイズ変更のみが適用されます。この場合は幅です。

ただし、元のコードは機能することがわかりました。私は単にそうはならないと思っていましたが、そうです。

7
Felix Maxime

Image Intervention Docs によると、これは3つの簡単な方法で実行できます。

// resize the image to a width of 300 and constraint aspect ratio (auto height)
$img->resize(300, null, function ($constraint) {
    $constraint->aspectRatio();
});

// resize the image to a height of 200 and constraint aspect ratio (auto width)
$img->resize(null, 200, function ($constraint) {
    $constraint->aspectRatio();
});

// prevent possible upsizing
$img->resize(null, 400, function ($constraint) {
    $constraint->aspectRatio();
    $constraint->upsize();
});

お役に立てれば...

13
Saumya Rastogi

私はレースに少し遅れていることを知っていますが、あなたが探している答えがあります:

$width = 600; // your max width
$height = 600; // your max height
$img = IMG::make($uploaded_file);
$img->height() > $img->width() ? $width=null : $height=null;
$img->resize($width, $height, function ($constraint) {
    $constraint->aspectRatio();
});

1000x1000の画像は600x600になります。

2000x1000の画像は600x300になります。これは、2つの値の最大値が600になり、もう一方の値が比例して制約されることを意味します。

これは、このコードが行うことです。私が誰かを助けることができることを願っています。

9

widen() および heighten() メソッドを使用できます。

widen()

現在の画像のサイズを新しい幅に変更し、アスペクト比を制限します。オプションのClosureコールバックを3番目のパラメーターとして渡し、アップサイジングの可能性を防ぐなどの追加の制約を適用します。

heighten()

現在の画像のサイズを新しい高さに変更し、アスペクト比を制限します。オプションのClosureコールバックを3番目のパラメーターとして渡し、アップサイジングの可能性を防ぐなどの追加の制約を適用します。

または、aspectRatio()制約を使用することもできます。 resize() ドキュメントの例:

// resize the image to a width of 300 and constrain aspect ratio (auto height)
$img->resize(300, null, function ($constraint) {
    $constraint->aspectRatio();
});

// resize the image to a height of 200 and constrain aspect ratio (auto width)
$img->resize(null, 200, function ($constraint) {
    $constraint->aspectRatio();
});
1
Alexey Mezenin

これは同様の作業を行うための私のテンプレートです

<?php

namespace App\ImageSize;

use Intervention\Image\Image;
use Intervention\Image\Filters\FilterInterface;

class Large implements FilterInterface
{
    public function applyFilter(Image $image)
    {
        $w = $image->width();
        $h = $image->height();
        if($w > $h) {
            $image->resize(1000, null, function ($constraint) {
                $constraint->aspectRatio();
            });
        } else {
            $image->resize(null, 1000, function ($constraint) {
                $constraint->aspectRatio();
            });
        }

        return $image;

    }
}
0
catalin87

そのため、画像プレビューコンポーネントを作成していましたが、max-width、max-heightを最大値に設定してから、width、heightをautoに設定すると、画像のアスペクト比が損なわれないことがわかりました。
https://codepen.io/kriss-robert/pen/aaNaZR?editors=11

max-width: 100%;
max-height: 100%;
width: auto;
height: auto;

これが誰かの助けになることを願っています:D

0
Kriss Robert