2016-10-21 109 views
1

我目前正在从base64 png创建一个图像,然后合并另一个PNG。我的代码如下,但temp.png仅仅是空的,即使$文件名的输出仍然是原来的图像:PHP GD图像不合并

session_start(); 

$email = $_SESSION['email']; 
$img = $_POST['img']; 
$img = str_replace('data:image/png;base64,', '', $img); 
$img = str_replace(' ', '+', $img); 
$fileData = base64_decode($img); 
$fileName = "./gallery/" . bin2hex(openssl_random_pseudo_bytes(16)) . ".png"; 
file_put_contents($fileName, $fileData); 

//Merge Two Images 
header ("Content-type: image/png"); 
$background = imagecreatefrompng($fileName); 
$pkt = imagecreatefrompng("./frames/frame1.png"); 
$insert_x = imagesx($pkt); 
$insert_y = imagesy($pkt); 
imagecopymerge($background,$pkt,0,0,0,0,$insert_x,$insert_y,100); 
imagepng($background,"temp.png",100); 
+0

也许关于你的png透明度。检查[这个问题](http://stackoverflow.com/questions/5529306/i-cant-use-transparent-background-with-imagecopymerge) – cwps

回答

0

您指定copyMerge()为100个;这不是真的合并,如果图像大小相等,它只是复制。您应该只看到frame1中的图像。

如果您依赖的是Alpha通道,请使用例如pnginfo实用程序来验证这两个图像都具有有效的alpha分量。

+0

尽管它是完全空的,甚至没有第一个图像。我也尝试过使用预先构建的图像,当我将鼠标悬停在编辑器的链接上时,它们都存在,但它仍然是空的。 – NodziGames

+0

你能把图像放在什么地方吗?今天晚些时候我可以试用你的代码。 – LSerni

+0

感谢您的帮助。只是想出来并写出来作为答案。 – NodziGames

0

感谢Iserni指出这不是合并。我写了一个小函数如下:

function imagecopymerge_alpha($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct) 
{ 
    $cut = imagecreatetruecolor($src_w, $src_h); 

    imagecopy($cut, $dst_im, 0, 0, $dst_x, $dst_y, $src_w, $src_h); 
    imagecopy($cut, $src_im, 0, 0, $src_x, $src_y, $src_w, $src_h); 
    imagecopymerge($dst_im, $cut, $dst_x, $dst_y, 0, 0, $src_w, $src_h, $pct); 
} 

希望这可以帮助别人!