1

我需要在背景图像上显示用户上传的徽标。标志的背景应该是透明的。

问题是大多数用户不知道如何使他们的图像透明,更不用说如何使用 alpha-transparency,所以大多数上传的徽标都有白色背景。

在 Photoshop 中,当您选择“深色”作为图层的混合模式时,在背景上显示这些徽标非常有效。

我试图在 PHP 中实现同样的效果,所以我可以在没有Photoshop 的情况下完成这项工作。

有任何想法吗 ?

4

4 回答 4

0

此功能似乎适合您的需求。

http://www.php.net/manual/en/function.imagecolortransparent.php

否则,您可能必须遍历所有像素,将它们与下面的像素进行比较,并为结果图像选择较暗的像素。

于 2013-04-26T16:50:48.307 回答
0

就我个人而言,图像魔法比 GD 有更好的结果,但它并非在所有平台上都可用http://php.net/manual/en/imagick.painttransparentimage.php

   // Loads image
    $im = new Imagick($source);

    // Apply fuzz
    $im->paintTransparentImage($im->getImagePixelColor(0, 0), 0, $fuzz);

     // Writes image
    $im->setImageFormat('png');
    $im->writeImage($target);
    $im->destroy();

请注意,$im->getImagePixelColor(0, 0)如果这应该适用于任何颜色的 BG,则从图像的左上角获取像素颜色,$fuzz根据徽标的羽化程度进行调整,如果它是所有直线和纯色,可能会保持较低

此外http://www.php.net/manual/en/imagick.trimimage.php对于删除图像中的空白空间非常有用。

于 2013-04-26T16:55:10.913 回答
0

我可以想到两种可能的解决方案。

一种是在客户端级别使用 javascript 进行像素混合。这可能有点重处理器,因此它可能不是最好的解决方案,尤其是对于手机和其他轻量级设备。有一个名为pixastic的库,它允许一些类似 Photoshop 的混合模式。

另一种解决方案是在 php 中使用 gd2 处理上传的图像,并通过替换背景颜色重新创建具有透明度的徽标。在这种情况下,您必须知道他们使用的背景颜色是什么。然后,如果他们也在徽标中使用相同的颜色怎么办?你也不想让它透明。

查看以下 php 函数(以及该系列中的其他函数):

imagealphablending
imagecolortransparent

就个人而言,我更喜欢处理图像并制作永久文件以在必要时重复使用的 PHP 方法。但更好的是,我只是不会依赖普通用户来创建徽标。

如果您真的需要让用户创建这些类型的文件,您几乎应该制作一个基于 Web 的工具,让他们指定透明区域,有点像 Visual Studio 图标编辑器。

于 2013-04-26T16:57:49.637 回答
0

我不确定 PS 的内部结构,但在我自己的实现中(不是在 PHP 中,请注意)我以下列方式处理任务:

  1. 提取前景和背景的亮度
  2. 比较前景和背景亮度以创建像素蒙版
  3. 根据派生的掩码分配输出。

我对通用伪代码的尝试:

Yfg = FG(:,:,1)*0.299 + FG(:,:,2)*0.587 + FG(:,:,3)*0.114;
Ybg = BG(:,:,1)*0.299 + BG(:,:,2)*0.587 + BG(:,:,3)*0.114;
mask = (Yfg > Ybg);
R = BG(mask) + FG(~mask);

这当然不同于“变暗”模式,后者只是对每个 RGB 通道进行关系混合。

我不确定这个操作在 PHP 中会有多麻烦。我比 PHP 更熟悉图像混合。

于 2015-11-10T18:08:49.080 回答