如何以编程方式将图像裁剪为非矩形形状?

时间:2010-01-22 20:37:48

标签: php image-processing image-manipulation

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

比方说,我想拍一张爱达荷州旗的照片并将其剪裁成爱达荷州的形状。我想我会做这样的事情:

  1. 创建一个图像,其中包含Idaho形状的不透明像素,其他地方的透明像素
  2. 读取并存储此爱达荷州图像的某种位图
  3. 对于爱达荷州图像中的每个不透明像素位置,从爱达荷州标志图像中复制相应的像素并将其放在空白的透明画布上
  4. 步骤1显然是手动完成的,但其余部分将以编程方式完成。我认为我一般都有正确的想法,但我不知道我是如何处理细节的。有人能指出我正确的方向吗?

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

3 个答案:

答案 0 :(得分:2)

这样做的通常方法是使用白色(全1)和黑色(全0)代替透明和不透明。然后你和你想要裁剪的图像和那个图像。结果是0是轮廓图像的0,而另一个图像的轮廓是1。

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分: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通道。