56362


  * 画像縦横比が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]


CC BY-SA 4.0
2019-07-03T12:11:07.693
56354
2019-07-03T21:04:51.437
7886
question
php imagemagick
PHPとImageMagickで画像縦横比が2対3となるよう縮小トリミングしたい


どの部分がわからないで質問されているのか曖昧な部分がありますが、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側に一部を任せられそうです。


CC BY-SA 4.0
2019-07-03T21:04:51.437
56362
2019-07-03T21:04:51.437
2376
56354
answer