【问题标题】:Merge multiple pictures into one将多张图片合并为一张
【发布时间】:2016-03-31 16:53:41
【问题描述】:

假设我想创建一个人脸生成器,我将在其中设计几张脸形、耳朵、鼻子、嘴巴、头发的图片。给定这些图片的组合,我如何在 PHP 中创建新图片?例如,简化版:

有face1.png、face2.png、nose1.png和nose2.png。我怎样才能以编程方式将 face1.png 与 nose2.png 合并,这样结果图片就会包含两个图片的内容?

【问题讨论】:

标签: php image-processing


【解决方案1】:

您基本上有三个选项:GD、Cairo 或 ImageMagic。如果可用,我建议使用 Imagick 类。如果没有,ImageMagick 通过 PHP 系统调用。如果这不可用,GD 可能就足够了。

这取决于您的服务器配置,其中哪些可用,哪些需要安装其他软件包。

Imagick 文档中有一个非常简单的图像组合示例:https://secure.php.net/manual/en/imagick.compositeimage.php

我还为 GD 找到了这个示例: Merge two PNG images with PHP GD library

【讨论】:

  • 这个 imagecopymerge 想法至少值得一票。让我做几个实验。
【解决方案2】:

有一个名为imagecopy 的函数。此函数使用源图像覆盖目标图像的一部分。给定部分被指定为参数。在你告诉我这不能解决你的问题之前,我必须补充一点,如果像素是透明的,目标图片中的像素不会被源图片的像素覆盖。你需要在源图片上使用imagealphablendingimagesavealpha,像这样:

public static function experimental($images, $width, $height, $dest = null) {

        $index = 0;

        if ($dest === null) {
            $dest = $images[$index++];
        }

        while ($index < count($images)) {
            imagealphablending($images[$index], true);
            imagesavealpha($images[$index], true );
            imagecopy($dest, $images[$index++], 0, 0, 0, 0, $width, $height);
        }

        return $dest;
    }

如果我们有这两张图片:

结果会是这样的:

【讨论】:

    【解决方案3】:

    你真的想用 PHP 来做吗? 好的。

    1) 您可以使用 GD 库进行图像处理。 2)您可以使用imagemagic PHP包装器--imagic。

    但我认为您应该在客户端使用画布。为了保存结果,您可以将画布(或分离的图层/图片)的 base64 png 图像表示发送到后端。

    【讨论】:

    • 出于安全考虑,图像生成不应真正交给客户端。此外,禁用 Javascript 的用户代理也无济于事。这应该在服务器上使用 GD 库完成。我在问你怎么做到的?
    • @LajosArpad 怎么样?对于客户端和后端,您必须计算图片的边界/位置并合并这些图层。您想要 GD 库的示例吗?
    • 恐怕你没看懂这个问题。让我们假设有更多图片,每张图片都包含一些有用的内容和一些透明背景。有用的内容不重叠。我想将有用的内容合并到一张图片中。我可以计算出界限,但我认为这已经由某人完成了。所以,当且仅当你知道答案时,你才能告诉我应该组合哪些功能以及如何组合。如果不是,那么我恐怕我不能接受这个答案,虽然,我很感激你的努力。
    • 我理解你的问题。这个作品必须是手工制作的(你或其他人以后),因为不能更正自动添加所有源图片的边界/坐标。
    • 对于完整存储的边界/坐标/图像,您可以生成合并层的任何变体。
    猜你喜欢
    • 2011-11-04
    • 2022-01-19
    • 2013-07-18
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多