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

Merge two images.png to output.png using gd

我一直在尝试使用 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);

正如您可能注意到的,我对图像 宽度高度 进行了硬编码。 而不是使用 getimagesize

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

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

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

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

事实上,错误不是由 getimagesize 产生的,并且没有必要对图像大小进行硬编码。

纯图片格式问题。

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

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

给 Maik 点赞,并检查您的 .png 格式类型(类型 3)。

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