PHPとImageMagickで画像縦横比が2対3となるよう縮小トリミングしたい


  * 画像縦横比が2対3の場合  
何もしない

  * 画像縦横比が2対3以外の場合  
画像縦横比が2対3となるよう(良い感じに)縮小したい  
短辺を基準？にしてリサイズ後、(左上基準で)トリミング？？

* * *

作成中のコード

[code]

    $im = new Imagick();
    $size = $im->getImageGeometry();
    $w = $size['width'];
    $h = $size['height'];
    
    if($w > $h){ //縦が短辺
      if($w*3 != $h*2){
        $im->resize(null, $h, function ($constraint) {
            $constraint->aspectRatio();
        });
        $im->cropImage(?, $h, 0, 0);
      }
    
    }elseif($w = $h){
    
    
    }elseif($w < $h){
      if($h*3 != $w*2){
      }
    
    }
    
[/code]




どの部分がわからないで質問されているのか曖昧な部分がありますが、2:3(縦長)で入力画像のはみでる部分だけをトリミングする場合こんなかんじでしょうか。(小数点以下の端数が出るアス比は適当に近い数字で)

[code]

    <?php
    
    function crop(string $in, string $out)
    {
        $image = new Imagick($in);
    
        $size = $image->getImageGeometry();
        $w = $size['width'];
        $h = $size['height'];
    
        if ($w * 1.5 > $h) {
            $width = round($h / 1.5);
            $x = round(($w - $width) / 2);
    
            $image->cropImage($width, $h, $x, 0);
        } else {
            $height = round($w * 1.5);
            $y = round(($h - $height) / 2);
    
            $image->cropImage($w, $height, 0, $y);
        }
    
        $image->writeImage($out);
        $image->clear();
    }
    
    // test
    crop('https://dummyimage.com/300x600.png', 'out/300x600.png');
    crop('https://dummyimage.com/400x600.png', 'out/400x600.png');
    crop('https://dummyimage.com/600x300.png', 'out/600x300.png');
    crop('https://dummyimage.com/600x400.png', 'out/600x400.png');
    crop('https://dummyimage.com/600x600.png', 'out/600x600.png');
    crop('https://dummyimage.com/600x800.png', 'out/600x800.png');
    crop('https://dummyimage.com/600x1000.png', 'out/600x1000.png');
    crop('https://dummyimage.com/900x600.png', 'out/900x600.png');
    crop('https://dummyimage.com/1200x600.png', 'out/1200x600.png');
    
[/code]

`Imagick::cropThumbnailImage`使うのもあり？その場合

[code]

        if ($w * 1.5 > $h) {
            $width = round($h / 1.5);
            $image->cropThumbnailImage($width, $h);
        } else {
            $height = round($w * 1.5);
            $image->cropThumbnailImage($w, $height);
        }
    
[/code]

のようにImageMagick側に一部を任せられそうです。




どの部分がわからないで質問されているのか曖昧な部分がありますが、2:3(縦長)で入力画像のはみでる部分だけをトリミングする場合こんなかんじでしょうか。(小数点以下の端数が出るアス比は適当に近い数字で)

[code]

    <?php
    
    function crop(string $in, string $out)
    {
        $image = new Imagick($in);
    
        $size = $image->getImageGeometry();
        $w = $size['width'];
        $h = $size['height'];
    
        if ($w * 1.5 > $h) {
            $width = round($h / 1.5);
            $x = round(($w - $width) / 2);
    
            $image->cropImage($width, $h, $x, 0);
        } else {
            $height = round($w * 1.5);
            $y = round(($h - $height) / 2);
    
            $image->cropImage($w, $height, 0, $y);
        }
    
        $image->writeImage($out);
        $image->clear();
    }
    
    // test
    crop('https://dummyimage.com/300x600.png', 'out/300x600.png');
    crop('https://dummyimage.com/400x600.png', 'out/400x600.png');
    crop('https://dummyimage.com/600x300.png', 'out/600x300.png');
    crop('https://dummyimage.com/600x400.png', 'out/600x400.png');
    crop('https://dummyimage.com/600x600.png', 'out/600x600.png');
    crop('https://dummyimage.com/600x800.png', 'out/600x800.png');
    crop('https://dummyimage.com/600x1000.png', 'out/600x1000.png');
    crop('https://dummyimage.com/900x600.png', 'out/900x600.png');
    crop('https://dummyimage.com/1200x600.png', 'out/1200x600.png');
    
[/code]

`Imagick::cropThumbnailImage`使うのもあり？その場合

[code]

        if ($w * 1.5 > $h) {
            $width = round($h / 1.5);
            $image->cropThumbnailImage($width, $h);
        } else {
            $height = round($w * 1.5);
            $image->cropThumbnailImage($w, $height);
        }
    
[/code]

のようにImageMagick側に一部を任せられそうです。

