2012-02-20 65 views
7

有没有人可以合并两个PNG图像的脚本?用PHP GD库合并两个PNG图像

具备以下条件:

  • 两个图像具有透明区域
  • 第二图像必须有50%的不透明度(它覆盖在第一图像

这是我试图做的,但没有运气:

<?php 

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); 
} 

$image1 = imagecreatefrompng('a.png'); //300 x 300 
$image2 = imagecreatefrompng('b.png'); //150 x 150 

$merged_image = imagecreatetruecolor(300, 300); 
imagealphablending($merged_image, false); 
imagesavealpha($merged_image, true); 

imagecopy($merged_image, $image1, 0, 0, 0, 0, 300, 300); 
imagecopymerge_alpha($merged_image, $image2, 0, 0, 0, 0, 150, 150, 50); 

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

?> 

编辑:

  • 第一个图像(左)和第二图像(右)

enter image description hereenter image description here

  • 这是怎么回事应该是(左)和我的代码结果(右)

enter image description hereenter image description here

  • 的解决方案通过dqhendricks

enter image description here

+2

解释*,但没有运气*。你发布的代码产生了什么? – 2012-02-20 18:14:38

+2

欢迎来到Stack Overflow! “它不工作”是*从来不是一个好的错误描述。请描述出了什么问题,您收到了哪些错误消息等。 – 2012-02-20 18:21:41

+0

第一张图片看起来很透明,第二张图片的背景(应该是透明的)变成黑色(半透明的黑色)。 – acoder 2012-02-20 18:28:57

回答

8
$image1 = imagecreatefrompng('a.png'); //300 x 300 
$image2 = imagecreatefrompng('b.png'); //150 x 150 
imagecopymerge($image1, $image2, 0, 0, 75, 75, 150, 150, 50); 

这应该是所有你需要建议的结果。 $ image1应该保存合并的图像,其中image2已覆盖50%的不透明度。最后一个参数是合并副本的字母。

http://php.net/manual/en/function.imagecopymerge.php

+0

根据你的建议,我用imagecopymerge($ image1,$ image2,0,0,0,150,150,50);我发布了问题描述中的结果图片。 – acoder 2012-02-20 22:09:04

+0

@acoder您使用的是哪个版本的PHP? – dqhendricks 2012-02-20 22:43:20

+0

你可以在image1和image2上运行http://www.php.net/manual/en/function.imageistruecolor.php来验证它们是否被加载为真彩图像? – dqhendricks 2012-02-20 22:54:58

0
$merged_image = imagecreatetruecolor(300, 300); 
imagealphablending($merged_image, false); 
imagesavealpha($merged_image, true); 

imagecopy($merged_image, $image1, 0, 0, 0, 0, 300, 300); 
// after first time of "imagecopy" change "imagealphablending" 
imagealphablending($merged_image, **true**); 

imagecopy($merged_image, $image2, 0, 0, 0, 0, 300, 300);