【问题标题】:ImageMagick Trim Whitespace with offsetImageMagick 用偏移量修剪空白
【发布时间】:2016-08-03 12:34:51
【问题描述】:

我正在使用 ImageMagick 从我的图像中修剪空白。一切工作正常并成功修剪。但现在我想留下大约 30px 的偏移量并从图像中删除额外的空白。我的意思是说我目前的结果是

现在你可以看到上面的图像被完全修剪了,但我想要一些像这样的偏移

我想在每一边留下 30px 并修剪剩余的空白。我正在使用以下代码对 Fuzz 进行修剪

$image = new Imagick('capfile.jpg');                                        
$image->trimImage(25000);

我不想添加边框或裁剪。我只想用 30px 的偏移量修剪主图像本身,因为我的许多图像也有一些浅色背景颜色,这些颜色是使用 Fuzz 修剪的,所以添加边框不是一种选择。

【问题讨论】:

    标签: php image-processing imagemagick


    【解决方案1】:

    我知道这有点傻,但这对我有用,而且是解决方法。我无法得到这个,所以我想出了完全不同的方法。

    1) 有时我们会上传像卧室内部这样的可视化照片,因此我们不需要修剪照片中的空白,因为它不存在。这就是为什么我们需要使用此线程https://stackoverflow.com/a/5959461/2760717

    中的 get_avg_luminance 函数来检查照片是亮还是暗

    2) 现在我们要写这个

    $src_image = new Imagick($src_file);
    $dimmensions = $src_image->getImageGeometry();
    $height = $dimmensions['height'];
    $luminance = get_avg_luminance($src_file);
    
    // If image is mostly bright then add white border with 5% of entire height
    if ($luminance > 170) {
        $quantumInfo = $src_image->getQuantumRange();
        if ($src_image->trimImage($quantumInfo['quantumRangeLong']*0.1)) {
                // add white border with 5% of offset
                $src_image->borderImage('#ffffff', 0, ($height *0.05));
        }
    }
    

    它正在为图像添加边框并且对我来说工作正常:)

    【讨论】:

      【解决方案2】:

      您可以在命令行中获得 ImageMagick 修剪成这样的修剪框:

      convert -fuzz 10% -format %@ cap.jpg info:
      259x171+19+21
      

      然后您可以在使用修改后的数字进行裁剪之前根据需要修改宽度/高度和偏移量 - 即从 x 和 y 偏移量中减去 30,然后在宽度和高度上加上 60。

      由 emcconville 编辑

      如何在 php 中做到这一点?

      这是一个 PHP 替代方案...

      $img = new Imagick('/tmp/Zpuq9.jpg');
      // Get Quantum to calculate 40%
      $quantumInfo = $img->getQuantumRange();
      // -fuzz 40%
      $img->trimImage($quantumInfo['quantumRangeLong'] * 0.4);
      // -format %@
      $img->setOption('format','%@');
      // info:
      $img->setImageFilename('info:');
      
      /*
       * For this example, let's use PHP memory protocol
       * to capture std out (from `info:').
       */
      $fd = fopen('php://memory','rwb');
      $img->writeImageFile($fd);
      fseek($fd, 0);
      $info = fread($fd, 1024);
      fclose($fd);
      var_dump($info);
      //=> string(13) "258x170+19+22"
      

      【讨论】:

      • 如何在 php 中做到这一点?请提供此命令的 php 代码格式,以便我理解。因为我最近才开始使用 ImageMagick
      • @emcconville 在我的情况下它不起作用。这个模糊值似乎没有被应用。我的图像在图像空白结尾处被完美切割。
      猜你喜欢
      • 2014-06-27
      • 2018-08-26
      • 2017-03-16
      • 1970-01-01
      • 2013-12-29
      • 1970-01-01
      • 2010-11-14
      • 2011-05-07
      • 1970-01-01
      相关资源
      最近更新 更多