之前在网上找了一个函数,生成水印的,支持jpg,gif,和png,但是每次在生成png图片的水印时总出错。
创建一个0字节的png文件,就失败了。后调试了下,发现是几个参数的问题
第一:生成水印后变成0字节文件。
原因在与代码里使用了:
imagepng($ground_im,$groundImage,100);翻看了下手册,5.1.2开始,php引入了第三个参数,但是Imagepng的第三个参数只有0到9,估计是写代码的人不小心造成。
第二:打上水印后,png格式不再透明。
找了很多地方,别人都只说解决了,没说怎么解决的。
通过实践,在imagecopy前加两句
//设定图像的混色模式一般第一句可能已经有了,只需要第二句了。
imagealphablending($ground_im, true);
//支持PNG透明
imagesavealpha($ground_im, true);
到此,问题解决
完整函数代码如下
/**
* make_watermark()
*
* @param mixed $groundImage
* @param string $waterImage
* @param integer $waterPos
* @param integer $xOffset
* @param integer $yOffset
* @return void
*/
function make_watermark($groundImage,$waterImage="",$waterPos=0,$xOffset=0,$yOffset=0)
{
if(!empty($waterImage) && file_exists($waterImage))
{
$water_info = getimagesize($waterImage);
$water_w = $water_info[0];//取得水印图片的宽
$water_h = $water_info[1];//取得水印图片的高
switch($water_info[2])
{
//取得水印图片的格式
case 1:
{
$water_im = imagecreatefromgif($waterImage);
break;
}
case 2:
{
$water_im = imagecreatefromjpeg($waterImage);
break;
}
case 3:
{
$water_im = imagecreatefrompng($waterImage);
break;
}
}
}
//读取背景图片
if(!empty($groundImage) && file_exists($groundImage))
{
$ground_info = getimagesize($groundImage);
$ground_w = $ground_info[0];//取得背景图片的宽
$ground_h = $ground_info[1];//取得背景图片的高
switch($ground_info[2])
{
//取得背景图片的格式
case 1:
{
$ground_im = imagecreatefromgif($groundImage);
break;
}
case 2:
{
$ground_im = imagecreatefromjpeg($groundImage);
break;
}
case 3:
{
$ground_im = imagecreatefrompng($groundImage);
break;
}
}
}
$w = $water_w;
$h = $water_h;
//水印位置
switch($waterPos)
{
case 0:
{
//随机
$posX = rand(0,($ground_w - $w));
$posY = rand(0,($ground_h - $h));
break;
}
case 1:
{
//1为顶端居左
$posX = 0;
$posY = 0;
break;
}
case 2:
{
//2为顶端居中
$posX = ($ground_w - $w) / 2;
$posY = 0;
break;
}
case 3:
{
//3为顶端居右
$posX = $ground_w - $w;
$posY = 0;
break;
}
case 4:
{
//4为中部居左
$posX = 0;
$posY = ($ground_h - $h) / 2;
break;
}
case 5:
{
//5为中部居中
$posX = ($ground_w - $w) / 2;
$posY = ($ground_h - $h) / 2;
break;
}
case 6:
{
//6为中部居右
$posX = $ground_w - $w;
$posY = ($ground_h - $h) / 2;
break;
}
case 7:
{
//7为底端居左
$posX = 0;
$posY = $ground_h - $h;
break;
}
case 8:
{
//8为底端居中
$posX = ($ground_w - $w) / 2;
$posY = $ground_h - $h;
break;
}
case 9:
{
//9为底端居右
$posX = $ground_w - $w;
$posY = $ground_h - $h;
break;
}
default:
{
//随机
$posX = rand(0,($ground_w - $w));
$posY = rand(0,($ground_h - $h));
break;
}
}
//设定图像的混色模式
imagealphablending($ground_im, true);
//支持PNG透明
imagesavealpha($ground_im, true);
imagecopy($ground_im, $water_im, $posX + $xOffset, $posY + $yOffset, 0, 0, $water_w,$water_h);//拷贝水印到目标文件
@unlink($groundImage);
switch($ground_info[2])
{
case 1:
{
imagegif($ground_im,$groundImage,100);
break;
}
case 2:
{
imagejpeg($ground_im,$groundImage,100);
break;
}
case 3:
{
imagepng($ground_im,$groundImage,9);
break;
}
}
//释放内存
if(isset($water_info))
{
unset($water_info);
}
if(isset($water_im))
{
imagedestroy($water_im);
}
unset($ground_info);
imagedestroy($ground_im);
}