使用 gd 将两个 images.png 合并到 output.png

Posted

技术标签:

【中文标题】使用 gd 将两个 images.png 合并到 output.png【英文标题】:Merge two images.png to output.png using gd 【发布时间】:2021-08-12 22:00:00 【问题描述】:

我一直在尝试使用 gd lib 合并两个图像。 一张卡片(背景)和一张卡片的“新”框架(前景,中间是透明的)。

这是我的代码:

<?php
    
    $card = imagecreatefrompng('img/folder1/card.png');
    $frame = imagecreatefrompng('img/folder2/frame.png');
    
    list($width,$height) = getimagesize($frame);
    
    imagealphablending($card, true);
    imagesavealpha($card, true);
    
    imagecopy($card, $frame, 0, 0, 0, 0, $width, $height, 100);
    header('Content-Type: image/png');
    imagepng($card);
    

我确实得到了输出,但它只是没有框架的卡片。

亲切的问候, 采埃孚

编辑(12 小时后): 我弄清楚了为什么我的输出只是卡片(背景),而不管我的更改如何。

我删除了 $height 之后的最后一个值 100

imagecopy($card, $frame, 0, 0, 0, 0, $width, $height);

现在我的输出只有 frame.png。 我使用 ImageAlphaBlending 没关系。

但我知道 card.png 肯定在 frame.png 下,因为我将 frame.png 移到了一边轴,并且 card.png 变得可见。 所以它无法将图像合并在一起,尊重 frame.png

的透明度

如果我将输出保存到文件中,它是一个透明的 .png 文件。

imagecopy 是否适合将带有透明中间的 frame.png 合并到背景 (card.png) 上?

编辑: 对不起,混乱! 我同时使用两个版本。 我现在已经清理了我当前的工作空间,并从头开始编写了一个新版本。

我确实删除了我在此处发布的版本中 $height 之后的 100

imagecopy($card, $frame, 0, 0, 0, 0, $width, $height);

对先前编辑的澄清:根本没有改变。 输出仍然只有 card.png

但是我的新版本的代码是(Final & Working):

<?php

$card = imagecreatefrompng('img/folder1/card.png');
$frame = imagecreatefrompng('img/folder2/frame.png');

$width = "402"; $height = "599";

imagealphablending($card, true);
imagesavealpha($card, true);

imagecopy($card, $frame, 0, 0, 0, 0, $width, $height);

header('Content-Type: image/png');
imagepng($card);

imagedestroy($card);
imagedestroy($frame);

您可能注意到我对图像widthheight 进行了硬编码。 而不是使用 getimagesize

list($width,$height) = getimagesize($frame);

我之前确实检查了 $width$height 的输出,它们是正确的,但这似乎是我的问题。 如果有人对此有答案,请随时解释!

【问题讨论】:

酷!做得好!我更喜欢使用 imagick 而不是 gd。 imagick 也更快。 因为getimagesize问题。实际上,它应该像这样工作。也许是PNG本身。例如,错误的格式类型。可以显示类型:list($width, $height, $type, $attr) = getimagesize("image_name.png"); PNG 应该是类型 3。 【参考方案1】:

我放弃了这个项目很长一段时间。 正如Maik 建议的那样,这可能是.png 格式的问题。

我应该说什么...建议和知识随着时间而来:

事实上,错误不是由getimagesize 产生的,因此不需要对图像大小进行硬编码。

这是一个普通的图像格式问题。

我从头开始编写的提到的“新版本”只是使用了不同格式的 .png 图像。

当时我只是不知道,因为我显然从创作者那里得到了相同的图像,但它是不同的渲染,因此是不同的格式类型。

支持 Maik,并检查您的 .png 格式类型(类型 3)。

编辑:哦,也许看看 imagick ;)

【讨论】:

以上是关于使用 gd 将两个 images.png 合并到 output.png的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP GD 合并两个图像

使用 PHP GD 库合并两个 PNG 图像

php使用GD库合并简单图片并变动部分颜色

如何在php GD中应用旋转功能后去除黑色背景?

在 PHP GD 中调整 png 大小时将 jpg 与 png 合并(水印)

php如何合并PNG图片