【问题标题】:How would I programmatically crop an image to a non-rectangular shape?我如何以编程方式将图像裁剪为非矩形?
【发布时间】:2011-01-08 09:14:30
【问题描述】:

我想将矩形图像裁剪为非矩形形状。我意识到,如果你完全按照字面意思理解,那是不可能的。我想最终得到的是图像 X,在透明背景上裁剪成 Y 形。

例如,假设我想拍摄爱达荷州旗的照片并将其裁剪为爱达荷州的形状。我想我会做这样的事情:

  1. 创建一个图像,其中包含爱达荷州形状的不透明像素,其他地方的透明像素
  2. 为此爱达荷州图像读取并存储某种位图
  3. 对于爱达荷州图像中的每个不透明像素位置,从爱达荷州标志图像中复制相应的像素并将其放置在空白的透明画布上

第 1 步显然需要手动完成,但其余部分将通过编程方式完成。我认为我的想法总体上是正确的,但我不知道如何处理细节。谁能指出我正确的方向?

就实现技术而言,我是一个 PHP 人,所以使用 gdLibrary 或与 PHP 一起工作的东西可能是我的最佳选择。

【问题讨论】:

  • 你应该在问题中添加 php 标签

标签: php image-processing image-manipulation


【解决方案1】:

在 php 中使用 ImageMagick 可能是你最好的选择:

$source = IMagick("sourcefile");
$mask = IMagick("maskfile");
$mask->adaptiveResizeImage($source->getImageWidth(), $source->getImageHeight(), true);
$source->compositeImage($mask, imagick::COMPOSITE_MULTIPLY, 0, 0);
$source->writeImage("newfile");
$source->clear();
$source->destroy();

sourcefile 必须是您喜欢的源图像,maskfile 必须是掩码文件,其 alpha 通道已正确设置为您想要的形状。

【讨论】:

    【解决方案2】:

    我认为只需添加一个位掩码或 Alpha 通道会更容易。在这种情况下,您将使用您的形状的负蒙版图像,然后简单地将其作为蒙版应用于常规图像,然后以透明格式保存。我从来没有真正用 GD 或 ImageMagick 做过这个,但我认为它可以像 Jerry 建议的那样使用。

    Acutally 这里是一个类似 SO 问题的博客文章,可能会有所帮助:http://about.phalacee.com/geek/creating-mask-layers-using-php-gd

    【讨论】:

      【解决方案3】:

      执行此类操作的常用方法是使用白色(全为 1)和黑色(全为 0)作为轮廓,而不是透明和不透明。然后,您将该图像与您要裁剪的图像相结合。结果是轮廓图像有 0 的 0,而轮廓有 1 的另一个图像。

      您可能还需要反转轮廓图像,并将反转版本与背景图像相结合。然后,您将背景图像与前景图像进行或运算,以生成爱达荷州形状的前景图像(使用您的示例)和其他任何地方的背景图像的合成。

      根据您使用的库的功能,这种功能很有可能是直接可用的。例如,Windows 在MaskBlt 函数中具有此功能。

      【讨论】:

        猜你喜欢
        • 2013-03-22
        • 2012-02-28
        • 2021-06-21
        • 2012-03-24
        • 1970-01-01
        • 1970-01-01
        • 2012-10-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多