【问题标题】:How to blend images using Photoshop 'darker color' blend mode?如何使用 Photoshop 的“深色”混合模式混合图像?
【发布时间】:2013-04-26 16:45:59
【问题描述】:

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

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

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

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

有什么想法吗?

【问题讨论】:

    标签: php image-processing photoshop alphablending gd2


    【解决方案1】:

    这个功能似乎符合你的需要。

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

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

    【讨论】:

    • 下面的像素是什么? php 将在网页的上下文之外合成图像。
    【解决方案2】:

    就我个人而言,image magick 的效果比 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对于删除图像中的空白空间非常有用。

    【讨论】:

      【解决方案3】:

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

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

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

      查看以下 php 函数(以及家族中的其他函数):

      imagealphablending
      imagecolortransparent
      

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

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

      【讨论】:

        【解决方案4】:

        我不确定 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 更熟悉图像混合。

        【讨论】:

          猜你喜欢
          • 2016-01-24
          • 2012-06-02
          • 2019-01-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多