我想把一个jpeg放在png后面 - 这里的png具有alpha透明度.
前景图片在这里:http: //peugeot208.srv.good-morning.no/images/marker-shadow.png
背后的图像是Facebook个人资料图片 - 通常是这样的:https: //graph.facebook.com/100000515495823/picture
结果图像失去透明度而是黑色:http: //peugeot208.srv.good-morning.no/libraries/cache/test.png
这是我使用的代码:
// combine image with shadow
$newCanvas = imagecreatetruecolor(90,135);
$shadow = imagecreatefrompng("marker-shadow.png");
//imagealphablending($newCanvas, false);
imagesavealpha($newCanvas, true);
imagecopy($newCanvas, $canvas, 20, 23, 0, 0, 50, 50);
imagecopy($newCanvas, $shadow, 0, 0, 0, 0, 90, 135);
imagepng($newCanvas, $tempfile, floor($quality * 0.09));
Run Code Online (Sandbox Code Playgroud)
如果我启用imagealphablending($ newCanvas,false);,结果是正确的(标记中间的孔是透明的)但是后面的图像消失了.
你能说清楚吗?:-)
谢谢!
编辑:找到解决方案
我做了一些摆弄,最后得到了这个代码 - 原点不是createimagetruecolor,而是从模板创建的图像 - 这是一个透明的png.
现在它可以工作 - 结果是透明的.我真的不知道为什么.知道为什么吗?
fbimage.php
// Create markerIcon
$src = $_REQUEST['fbid'];
$base_image = imagecreatefrompng("../images/marker-template.png");
$photo = imagecreatefromjpeg("https://graph.facebook.com/".$src."/picture");
$top_image = imagecreatefrompng("../images/marker-shadow.png");
imagesavealpha($base_image, true);
imagealphablending($base_image, true);
imagecopy($base_image, $photo, 20, 23, 0, 0, 50, 50);
imagecopy($base_image, $top_image, 0, 0, 0, 0, 90, 135);
imagepng($base_image, "./cache/".$src.".png");
?>
<img src="./cache/<?php echo $src ?>.png" />
Run Code Online (Sandbox Code Playgroud)
更新:检查以下代码 您可以在此处找到结果:http://peugeot208.srv.good-morning.no/images/marker.php 如您所见,背景仍为黑色.
// create base image
$base_image = imagecreatetruecolor(90,135);
$photo = imagecreatefromjpeg("marker-original.jpg");
$top_image = imagecreatefrompng("marker-shadow.png");
imagesavealpha($top_image, true);
imagealphablending($top_image, true);
imagesavealpha($base_image, true);
imagealphablending($base_image, true);
// merge images
imagecopy($base_image, $photo, 20, 23, 0, 0, 50, 50);
imagecopy($base_image, $top_image, 0, 0, 0, 0, 90, 135);
// return file
header('Content-Type: image/png');
imagepng($base_image);
Run Code Online (Sandbox Code Playgroud)
解决方案是将颜色分配为100%alpha透明,然后在基本图像的整个画布上绘制一个正方形:
// create base image
$base_image = imagecreatetruecolor(90,135);
// make $base_image transparent
imagealphablending($base_image, false);
$col=imagecolorallocatealpha($base_image,255,255,255,127);
imagefilledrectangle($base_image,0,0,90,135,$col);
imagealphablending($base_image,true);
imagesavealpha($base_image, true);
// ---
$photo = imagecreatefromjpeg("marker-original.jpg");
$top_image = imagecreatefrompng("marker-shadow.png");
// merge images
imagecopy($base_image, $photo, 20, 23, 0, 0, 50, 50);
imagecopy($base_image, $top_image, 0, 0, 0, 0, 90, 135);
// return file
header('Content-Type: image/png');
imagepng($base_image);
Run Code Online (Sandbox Code Playgroud)