我需要在背景图像上显示用户上传的徽标。标志的背景应该是透明的。
问题是大多数用户不知道如何使他们的图像透明,更不用说如何使用 alpha-transparency,所以大多数上传的徽标都有白色背景。
在 Photoshop 中,当您选择“深色”作为图层的混合模式时,在背景上显示这些徽标非常有效。
我试图在 PHP 中实现同样的效果,所以我可以在没有Photoshop 的情况下完成这项工作。
有任何想法吗 ?
我需要在背景图像上显示用户上传的徽标。标志的背景应该是透明的。
问题是大多数用户不知道如何使他们的图像透明,更不用说如何使用 alpha-transparency,所以大多数上传的徽标都有白色背景。
在 Photoshop 中,当您选择“深色”作为图层的混合模式时,在背景上显示这些徽标非常有效。
我试图在 PHP 中实现同样的效果,所以我可以在没有Photoshop 的情况下完成这项工作。
有任何想法吗 ?
此功能似乎适合您的需求。
http://www.php.net/manual/en/function.imagecolortransparent.php
否则,您可能必须遍历所有像素,将它们与下面的像素进行比较,并为结果图像选择较暗的像素。
就我个人而言,图像魔法比 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对于删除图像中的空白空间非常有用。
我可以想到两种可能的解决方案。
一种是在客户端级别使用 javascript 进行像素混合。这可能有点重处理器,因此它可能不是最好的解决方案,尤其是对于手机和其他轻量级设备。有一个名为pixastic的库,它允许一些类似 Photoshop 的混合模式。
另一种解决方案是在 php 中使用 gd2 处理上传的图像,并通过替换背景颜色重新创建具有透明度的徽标。在这种情况下,您必须知道他们使用的背景颜色是什么。然后,如果他们也在徽标中使用相同的颜色怎么办?你也不想让它透明。
查看以下 php 函数(以及该系列中的其他函数):
imagealphablending
imagecolortransparent
就个人而言,我更喜欢处理图像并制作永久文件以在必要时重复使用的 PHP 方法。但更好的是,我只是不会依赖普通用户来创建徽标。
如果您真的需要让用户创建这些类型的文件,您几乎应该制作一个基于 Web 的工具,让他们指定透明区域,有点像 Visual Studio 图标编辑器。
我不确定 PS 的内部结构,但在我自己的实现中(不是在 PHP 中,请注意)我以下列方式处理任务:
我对通用伪代码的尝试:
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 更熟悉图像混合。