PHP GD库打水印模糊?教你解决gd库模糊问题

PHP操作图片,失真主要有以下三个原因: 1.图片压缩比例太大; 2.图片非无压缩格式 3.输出图片没有设置质量 4.图片没有设置imagecreatetruecolor

主要问题是3和4,下面我们就来举例说明下, 实验图片: 简庆旺博客 PHP gd打水印 我们现在要把第一张作为底图,第二张作为水印, 代码如下:

<?php
$qrcode = 'youhuajun.png';
$logo = 'timg.jpg';

$qrcodeImg = imagecreatefrompng($qrcode);
$qrcodeImgTureColor = imagecreatetruecolor(imagesx($qrcodeImg), imagesy($qrcodeImg));
imagecopyresampled($qrcodeImgTureColor, $qrcodeImg, 0, 0, 0, 0, imagesx($qrcodeImg), imagesy($qrcodeImg), imagesx($qrcodeImg), imagesy($qrcodeImg));

switch (substr(strrchr($logo, '.'), 1)) {
    case 'png':
        $stamp = imagecreatefrompng($logo);
        break;
    case 'gif':
        $stamp = imagecreatefromgif($logo);
        break;
    case 'jpeg':
    case 'jpg':
        $stamp = imagecreatefromjpeg($logo);
        break;
    default:
        $logo = $defaultLogo;
        $stamp = imagecreatefrompng($logo);
}


$qrcodex = imagesx($qrcodeImg);
$qrcodey = imagesy($qrcodeImgTureColor);

$stampWidth = imagesx($stamp);
$stampHeight = imagesy($stamp);

// 设置水印图像的外边距,并且获取水印图像的尺寸
$newx = 80;
$newy = 80;
$newStamp = imagecreatetruecolor($newx, $newy);
//定义颜色
$color = imagecolorallocate($newStamp, 255, 255, 255);
//填充
imagefill($newStamp, 0, 0, $color);
imagecopyresampled($newStamp, $stamp, 0, 0, 0, 0, floor($newx), floor($newy), $stampWidth, $stampHeight);
$marge_right = $qrcodex / 2 - $newx / 2;
$marge_bottom = $qrcodey / 2 - $newy / 2;
$sx = imagesx($newStamp);
$sy = imagesy($newStamp);

// 利用图像的宽度和水印的外边距计算位置,并且将水印复制到图像上
imagecopymerge($qrcodeImgTureColor, $newStamp, imagesx($qrcodeImgTureColor) - $sx - $marge_right, imagesy($qrcodeImgTureColor) - $sy - $marge_bottom, 0, 0, imagesx($newStamp), imagesy($newStamp), 100);
header("content-type:image/png");
imagepng($qrcodeImgTureColor, null, 9);
?>

效果如下: PHP gd库打水印 注意一: 62行有个参数要注意,这个是控制文件输出质量,格式,输出方式的函数 function imagepng ($image, $filename = null, $quality = null, $filters = null) {} 这个函数,第一个是传图片,第二个参数filename 是文件名,如果不传则不保存,直接输出,$quality 是控制文件输出质量 其中,imagepng的quality只能写0-9,imagejpeg设置0~100,如果图片不清晰可能是这个原因。

注意二: 作为背景的图片,一定要先用画布画一次,设置真彩,然后跟原图合并,不然会导致不清晰 这也是我在18~20行代码画蛇添足的原因: $qrcodeImg = imagecreatefrompng($qrcode); $qrcodeImgTureColor = imagecreatetruecolor(imagesx($qrcodeImg), imagesy($qrcodeImg)); imagecopyresampled($qrcodeImgTureColor, $qrcodeImg, 0, 0, 0, 0, imagesx($qrcodeImg), imagesy($qrcodeImg), imagesx($qrcodeImg), imagesy($qrcodeImg));

简庆旺博客
请先登录后发表评论
  • latest comments
  • 总共0条评论