【问题标题】:Convert Imagemagick command to php imagick将 Imagemagick 命令转换为 php imagick
【发布时间】:2019-12-20 14:46:12
【问题描述】:

我需要将 ImageMagick 命令转换为 PHP Imagick。我尝试了一些组合,但没有按预期工作。该命令创建一条带有尖边和边缘渐变的线 命令是:

convert -size 300x1 xc:red \
\( -size 1x300 gradient: -rotate 90 -solarize 50% -level 0x50% -white-threshold 50% +write grad.png \) \
-alpha off -compose copy_opacity -composite red_grad.png`

感谢@fmw42 提供此命令

我已经尝试了以下代码:

$line = new Imagick();
$line->newPseudoImage(300,1,'xc:red');
$shadow = new Imagick();
$shadow->newPseudoImage(1, 300, 'gradient:red-white');
$shadow->rotateImage('transparent', 90);
$shadow->solarizeImage(50);
$shadow->levelImage(0,50,50);
$shadow->whiteThresholdImage('white');
$shadow->setImageCompose(0);
$shadow->writeImage('grad.png');
$shadow->compositeImage($line, Imagick::COMPOSITE_MATHEMATICS, 0, 0);

请指出我哪里错了

【问题讨论】:

  • 为什么要创建红白渐变?在我的代码中,它是黑白的。然后我晒太阳。使用 levelImage (0, 1.0, 65535/2)。 Gamma 值应为 1。Imagick 不使用百分比,而是使用 0 到 65535(量子范围)范围内的值来表示黑点和白点。日晒渐变使用 copy_opacity 的合成进入红线的 alpha 通道,而不是数学。我不太了解 Imagick,但为什么需要两套新的 Imagick。我想你只需要一个。
  • 还要注意,solarize 值应该是 50*quantumrange/100,因为对于 Q16 ImageMagick,它需要在 0 到 65535 的范围内。此外,白色阈值不是颜色,而是同一范围内的值。因此,对于我的 50%,它将是 50*quantumrange/100。请更仔细地阅读 Imagick 文档并查看每页底部的注释/cmets,并参考它们上有关参数的链接。
  • 更正,您需要两个新的 Imagick 命令。
  • 在下面查看我的答案。
  • 稍作调整,您的答案就奏效了。谢谢

标签: php imagemagick imagick


【解决方案1】:

我对翻译的最佳猜测如下。但是,这是未经测试的,我不太了解 Imagick。

$redline = new Imagick();
$redline->newPseudoImage(300,1,'xc:red');
$grad = new Imagick();
$grad->newPseudoImage(1, 300, 'gradient:black-white');
$grad->rotateImage('white', 90);
$grad->solarizeImage(50*Imagick::getQuantumRange/100);
$grad->levelImage(0,1,50*Imagick::getQuantumRange/100);
$grad->whiteThresholdImage(50*Imagick::getQuantumRange/100);
$redline->compositeImage($grad, Imagick::COMPOSITE_COPYOPACITY, 0, 0);
$redline->writeImage("redline.png");

【讨论】:

    【解决方案2】:

    经过一些调整,@fmw42 答案对我有用。下面给出正确的解决方案

    $redline = new Imagick();
    $redline->newPseudoImage(1100,3,'xc:'.$chipColourPixel->getColorAsString());
    $grad = new Imagick();
    $grad->newPseudoImage(3, 900, 'gradient:black-white');
    $grad->rotateImage('white', 90);
    $grad->solarizeImage((int)ceil(50*Imagick::QUANTUM_RANGE/100));
    $grad->levelImage(0,1,50*Imagick::QUANTUM_RANGE/100);
    $redline->compositeImage($grad, Imagick::COMPOSITE_COPYOPACITY, 0, 0);
    $redline->writeImage("redline.png");
    

    【讨论】:

      猜你喜欢
      • 2018-04-09
      • 2013-01-02
      • 2015-04-02
      • 1970-01-01
      • 2020-04-20
      • 1970-01-01
      • 2015-11-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多