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