php合并两个图像看起来坏了

Posted

技术标签:

【中文标题】php合并两个图像看起来坏了【英文标题】:php merging two images looks broken 【发布时间】:2016-02-18 09:24:37 【问题描述】:

我正在尝试使用 php 合并两个透明图像,但图像有一些黑色边框和点我无法弄清楚下面的问题是我附加的代码

$image1=$image2='imagepath.png';
imagealphablending($image2, true);
imagesavealpha($image2, true);

$w=imagesx($image1);
$h=imagesy($image1);

$final = imagecreatetruecolor($w, $h);

$black = imagecolorallocate($final, 0, 0, 0);
$backgroundColor = imagecolortransparent($final, $black);

$percent = 0.583;
$new_width = $w * $percent;
$new_height = $h * $percent;
$wshift = $w/8.5;
$hshift = $h/2.5;
imagecopy($final, $image1, 0,0,0,0,$w,$h);

imagecopyresized($final, $image2,$wshift,$hshift,0,0, $new_width, $new_height, $w, $h);

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

imagedestroy($image2);
imagedestroy($image1);
imagedestroy($final);

样本测试:

实际操作:http://goo.gl/qMWNB4

图片网址:http://goo.gl/pR59MT

【问题讨论】:

这既不是虚线边框,也不是真正的边框。发生这种情况是因为您的图片分辨率较低。 我用 300*300 像素的图片测试了同样的问题,如果它使用 600 *600 像素同样的问题,该怎么办 imagecopymerge 可能会有所帮助。 php.net/manual/en/function.imagecopymerge.php 我也尝试过解决问题 【参考方案1】:

好的,所以我试了一下,并设法做到了:

a) 弄乱你的代码 :) b) 去除足够多的黑色,我相信你可以完成这项工作!

$image1=$image2=imagecreatefrompng('test1.png');
imagealphablending($image2, false);
imagesavealpha($image2, true);

$w=imagesx($image1);
$h=imagesy($image1);

$final = imagecreatetruecolor($w, $h);

$percent = 0.583;
$new_width = $w * $percent;
$new_height = $h * $percent;
$wshift = $w/8.5;
$hshift = $h/2.5;

$temp = imagecreatetruecolor($new_width, $new_height);

imagecopymerge ($final, $image1, 0,0,0,0, $w , $h , 100);
imagecopymerge ($temp, $image2, 0,0,0,0, $w, $h, 100);

$black2 = imagecolorallocate($temp, 0, 0, 0);
$backgroundColor = imagecolortransparent($temp, $black2);

imagecopyresized($final, $temp,$wshift,$hshift,0,0, $new_width, $new_height, $w, $h);

$black = imagecolorallocate($final, 0, 0, 0);
$backgroundColor = imagecolortransparent($final, $black);

imagepng($final, 'output8.png');

希望你早日到达那里 - 为我回到日常工作:)

【讨论】:

我现在又要开始了——取得了一些进展。这是一个有趣的任务人! 通常情况下,你为什么有报价?您是否设法解决了这个问题? 是的,我正在使用你的代码,如果你有兴趣,我还有一些任务 兄弟,但是仍然图像看起来我们可以修复它吗【参考方案2】:

黑边是使用imagecolortransparent引起的。这适用于基于调色板的图像,而不是真彩色,并且在整个文件中使用单一颜色而不是每个像素的 alpha 值来实现透明度。

让它发挥作用的诀窍是在正确的时间设置正确的混合模式:

$img = imagecreatefrompng('35477413.png');

$w = imagesx($img);
$h = imagesy($img);

$final = imagecreatetruecolor($w, $h);
imagesavealpha($final, true);

$percent = 0.583;
$new_width = $w * $percent;
$new_height = $h * $percent;
$wshift = $w / 8.5;
$hshift = $h / 2.5;

// disable alpha blending so that transparent pixels replace target pixels.
imagealphablending($final, false);
imagecopy($final, $img, 0, 0, 0, 0, $w, $h);

// enable alpha blending so that transparent pixels blend with target pixels.
imagealphablending($final, true);
imagecopyresized($final, $img, $wshift, $hshift, 0, 0, $new_width, $new_height, $w, $h);

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

imagedestroy($img);
imagedestroy($final);

这给出了以下输出:

【讨论】:

以上是关于php合并两个图像看起来坏了的主要内容,如果未能解决你的问题,请参考以下文章

用 PHP 合并两个图像

使用 PHP GD 合并两个图像

如何在运行时合并两个图像并保存在 php 中?

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

使用 PHP GD 合并两个图像 (.JPG)

在 C#/.NET 中合并两个图像