【问题标题】:Tilt shifting an Image using ImageMagick in PHP在 PHP 中使用 ImageMagick 倾斜移动图像
【发布时间】:2012-06-21 21:47:08
【问题描述】:

我有一个可以在命令行上运行的命令,以使用 Imagemagick 倾斜移动图像:

转换 \( myimage.jpg -gamma 0.75 -modulate 100,130 -contrast \) \( +clone -sparse-color Barycentric "0,0 black 0,%h white" -function polynomial 4,-4,1 -level 0,50 % \) -compose blur -set 选项:compose:args 5 -composite myimage.jpg

我希望能够使用 PHP 的 imagemagick 库重现此命令的效果。该命令的第一部分很容易重现,但我无法弄清楚 sparse-color 及其后面的参数。到目前为止,我有:

$image = new imagick("myimage.jpg")
$image->gammaImage(0.75);
$image->modulateImage(100,130,100);
$image->contrastImage(1);

谢谢!

【问题讨论】:

  • 到目前为止,您似乎没有尝试过倾斜移位,对吧? imagemagick 的功能列表中有没有有希望的候选者?
  • 嗨 Hakre,我在重现我正在使用的命令行的后半部分时遇到了困难:( +clone -sparse-color Barycentric "0,0 black 0,%h white" -function polynomial 4, -4,1 -level 0,50% ) -compose blur -set option:compose:args 5 -composite 我遇到的问题是 PHP 中 Imagemagick 库的文档非常稀疏,没有任何示例例如,sparseColor
  • 是的,用户仍然需要在那里添加示例。如果我们可以在这里创建一个很好的示例,我们可以稍后将其添加到手册页中。我也很难找到一些命令行参数的拟合函数。
  • 是的,听起来不错。如果我让它工作,我也会将知识转移到 PHP imagick 文档中。

标签: php imagemagick imagick


【解决方案1】:

我假设您指的是此处找到的示例:

http://www.imagemagick.org/Usage/photos/

话虽如此,我一直在尝试用 PHP Imagick 完成同样的事情。我在 Linux 中使用 PHP Imagick 3.0.1 和 ImageMagick 6.7.4-4 2012-01-09 Q16。

模糊合成模式似乎没有记录。我通过查看 magick/composite.h 在线 88 下的 ImageMagick 源代码找到了它。

此代码完成了您正在寻找的内容:

$im = new Imagick();
$im->readImageBlob(file_get_contents($src));
$qr = $im->getQuantumRange();
$qr = $qr['quantumRangeLong'];
$im->sigmoidalContrastImage(true, 10, $qr / 2, Imagick::CHANNEL_ALL);
$blurmap = new Imagick();
$blurmap->setOption('compose:args', '5');
$blurmap->newPseudoImage($im->getImageWidth(), $im->getImageHeight(), 'gradient:black-white');
$blurmap->functionImage(Imagick::FUNCTION_POLYNOMIAL, array(4.5, -4.5, 1));
$blurmap->levelImage(0, 1, $qr / 2);
$im->compositeImage($blurmap, 57, 0, 0);
$blurmap->destroy();

如果您需要更多模糊,只需将compose:args 更改为10 或其他东西。我发现的一件事是,我必须在创建/加载任何东西到魔杖本身之前设置选项。

我无法让SparseColorImage() 函数像在命令行上那样运行,尽管我确信如果其他人弄明白了,他们可以贡献这部分。以上满足了我的需求。

编辑:在进一步检查生成的图像后,我注意到即使是模糊贴图的黑色部分也被模糊了。经过一番搜索,这似乎源于 ImageMagick 中引入的错误。我切换到版本 6.7.8-1 2012-07-05 Q16,现在模糊贴图似乎可以正常工作。如果您发现模糊合成造成不必要的模糊,我建议您升级 ImageMagick。

【讨论】:

    【解决方案2】:

    祝你好运 Vijay - 我建议你坚持使用 exec()

    反正刚刚试了一下,我的代码如下;您可以看到我所做的一些更改并放弃了一行错误:$new->functionImage (FUNCTION_POLYNOMIAL, $functionImagearray);

    // Did not like the %h
    // $sparseColorarray = array( 0, 0, black, 0, %h, white );
    $sparseColorarray = array( 0, 0, black, 0, 20, white );
    $functionImagearray = array( 4, -4, 1 );
    $image = new imagick("output3.jpg");
    $image->gammaImage(0.75);
    $image->modulateImage(100,130,100);
    $image->contrastImage(1);
    //$new = $image->clone(); 
    $new = clone $image; 
    $new->sparseColorImage( Imagick::SPARSECOLORMETHOD_BARYCENTRIC, $sparseColorarray );
    $new->functionImage ( Imagick::FUNCTION_POLYNOMIAL, $functionImagearray );
    // Did not like the %
    // $new->levelImage( 0, 50% );
    $new->levelImage( 0, 50 );
    // Can not find any options for this blur
    $image->setImageCompose ( BLUR );
    $image->setOption( args, 5);
    $image->compositeImage( $new, COMPOSITE_BLEND, 0, 0 );
    $image->writeImage( "tilt.jpg" );
    $image->destroy();
    

    阅读文档并遵循您的示例代码,这就是我想出的。我也找不到 $image->setImageCompose ( BLUR );

    的选项

    看看你能不能让它工作起来会很有趣。

    刚刚发现我的 Imagick 版本对于 functionImage 来说太旧了

    更改了 $new->functionImage 行

    【讨论】:

      【解决方案3】:

      我在 ImageMagick 方面没有丰富的经验,但我相信在文档 here 中可以找到与稀疏颜色重心等效的功能。

      它应该看起来像:

      $image -> sparseColorImage(int SPARSECOLORMETHOD_BARYCENTRIC (integer), 
                                 array $arguments [, int $channel = CHANNEL_DEFAULT ])
      

      FUNCTION_POLYNOMIAL 和其他方法常量/通道常量可以在here 中找到以供将来参考!

      Gaussian Blurring 通过添加处理:

      $image -> gaussianBlurImage ( float $radius , 
                                    float $sigma [, int $channel = CHANNEL_ALL ] )
      

      当然,这些都是非常通用的,但您可以随意使用以获得您想要的外观和感觉。

      希望这会有所帮助!

      梅森

      【讨论】:

      • 嗨,梅森 - 不幸的是,这并没有多大帮助。我已经阅读了 ImageMagick 库的文档。我正在寻找特定的命令。特别是,这对我不起作用: $coords = array(0,0,0,$image->getImageHeight()); $image->sparseColorImage(imagick::SPARSECOLORMETHOD_BARYCENTRIC, $coords);
      • 什么类型的错误,如果有的话,当你尝试时它会给出吗?我能想象到的唯一错误是传递的坐标数组。所需数组的模型是'array(1,1, 2, 45)',但这确实是我的专业知识所扩展的......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多