PHP生成图片加水印(文字、图片)

<?php

setWater('https://bdimg1.qunliao.info/tos-cn-i-j5hyufq5o6/fastdfs3/M00/D2/43/ChONol2Rfv-AbLlbAAGhnL0QGkY8623085~tplv-j5hyufq5o6-scale:400:0.jpeg', 'dqd-water.png', '', '', 9, '', 'img');
//setWater('food.jpg', 'dqd-water.png', '', '', 9, '', 'img');

/**
 * 图片添加水印,支持根据图片尺寸自适应水印图片
 * @param $imgSrc, 目标图片,可带相对目录地址
 * @param $markImg, 水印图片,可带相对目录地址,支持PNG和GIF两种格式
 * @param $markText, 给图片添加的水印文字
 * @param $TextColor, 水印文字的字体颜色
 * @param $markPos, 图片水印添加的位置,取值范围:0~9
0:随机位置,在1~8之间随机选取一个位置
1:顶部居左 2:顶部居中 3:顶部居右 4:左边居中
5:图片中心 6:右边居中 7:底部居左 8:底部居中 9:底部居右
 * @param string $fontType, 具体的字体库,可带相对目录地址
 * @param string $markType, 图片添加水印的方式,img代表以图片方式,text代表以文字方式添加水印
 * @param string $filename, 保存文件名
 * @param string $midWidth, 等比例缩放水印图片的基值(宽度)
 */
function setWater($imgSrc, $markImg, $markText, $TextColor, $markPos, $fontType = '', $markType = 'img', $filename = '', $midWidth = 1000)
{
    $filename = 'test2.jpg';
    //获取图片尺寸
    $srcInfo = @getimagesize($imgSrc);
    $srcImg_w = $srcInfo[0];
    $srcImg_h = $srcInfo[1];
    //创建画布,载入图像
    switch ($srcInfo[2]) {
        case 1:
            $srcim = imagecreatefromgif($imgSrc);
            break;
        case 2:
            $srcim = imagecreatefromjpeg($imgSrc);
            break;
        case 3:
            $srcim = imagecreatefrompng($imgSrc);
            break;
        default:
            die("不支持的图片文件类型");
            exit;
    }
    //创建水印图品,同原图
    if ($markType == "img") {
        if (!file_exists($markImg) || empty($markImg)) {
            return false;
        }
        //根据图片尺寸,等比例缩放水印
        $markImg = image_resize(file_get_contents('dqd-water.png'), '', '', round($srcImg_w / 1000, 1));
        $markImgInfo = @getimagesize($markImg);
        $markImg_w = $markImgInfo[0];
        $markImg_h = $markImgInfo[1];
        if ($srcImg_w < $markImg_w || $srcImg_h < $markImg_h) {
            die("水印图片尺寸大于原图");
            exit;
        }
        /**
         * 缩放
         */
//        $block = imagecreatetruecolor($markImg_w * 0.5, $markImg_h * 0.5);
//        // 启用混色模式
//        imagealphablending($block, false);
//
//        // 保存PNG alpha通道信息
//        imagesavealpha($block, true);
//        // 创建原图画板
//        $markim = imagecreatefromstring(file_get_contents($markImg));
//
//        // 缩放
//        imagecopyresampled($block, $markim, 0, 0, 0, 0, $markImg_w * 0.5, $markImg_h * 0.5, $markImg_w, $markImg_h);
        switch ($markImgInfo[2]) {
            case 1:
                $markim = imagecreatefromgif($markImg);
                break;
            case 2:
                $markim = imagecreatefromjpeg($markImg);
                break;
            case 3:
                $markim = imagecreatefrompng($markImg);
                break;
            default:
                die("不支持的水印图片文件类型");
                exit;
        }
        $logow = $markImg_w;
        $logoh = $markImg_h;
    }

    if ($markType == "text") {
        $fontSize = 16;
        if (!empty($markText)) {
            if (!file_exists($fontType)) {
                return;
            }
        } else {
            return;
        }
        $box = @imagettfbbox($fontSize, 0, $fontType, $markText);
        $logow = max($box[2], $box[4]) - min($box[0], $box[6]);
        $logoh = max($box[1], $box[3]) - min($box[5], $box[7]);
    }

    //水印位置
    if ($markPos == 0) {
        $markPos = rand(1, 9);
    }
    switch ($markPos) {
        case 1:
            $x = +5;
            $y = +5;
            break;
        case 2:
            $x = ($srcImg_w - $logow) / 2;
            $y = +5;
            break;
        case 3:
            $x = $srcImg_w - $logow - 5;
            $y = +15;
            break;
        case 4:
            $x = +5;
            $y = ($srcImg_h - $logoh) / 2;
            break;
        case 5:
            $x = ($srcImg_w - $logow) / 2;
            $y = ($srcImg_h - $logoh) / 2;
            break;
        case 6:
            $x = $srcImg_w - $logow - 5;
            $y = ($srcImg_h - $logoh) / 2;
            break;
        case 7:
            $x = +5;
            $y = $srcImg_h - $logoh - 5;
            break;
        case 8:
            $x = ($srcImg_w - $logow) / 2;
            $y = $srcImg_h - $logoh - 5;
            break;
        case 9:
            $x = $srcImg_w - $logow - 5;
            $y = $srcImg_h - $logoh - 5;
            break;
        default:
            die("此位置不支持");
            exit;
    }
    //创建新的画布
    $dst_img = @imagecreatetruecolor($srcImg_w, $srcImg_h);
    //将图片绘制到画布上
    imagecopy($dst_img, $srcim, 0, 0, 0, 0, $srcImg_w, $srcImg_h);
    //加图片
    if ($markType == "img") {
        imagecopy($dst_img, $markim, $x, $y, 0, 0, $logow, $logoh);
        imagedestroy($markim);
    }
    //加文字
    if ($markType == "text") {
        $rgb = explode(',', $TextColor);
        $color = imagecolorallocate($dst_img, $rgb[0], $rgb[1], $rgb[2]);
        imagettftext($dst_img, $fontSize, 0, $x, $y, $color, $fontType, $markText);
    }
    //保存文件
    switch ($srcInfo[2]) {
        case 1:
            imagegif($dst_img, $filename);
            break;
        case 2:
            $res = imagejpeg($dst_img, $filename);
            break;
        case 3:
            imagepng($dst_img, $filename);
            break;
        default:
            die("不支持的水印图片文件类型");
            exit;
    }
    //销毁临时文件
    imagedestroy($dst_img);
    imagedestroy($srcim);
    unlink($markImg);
}


/**
 * 缩放图片
 * @param $imagedata,    图像数据
 * @param $width,        缩放宽度
 * @param $height,       缩放高度
 * @param int $per,      缩放比例,为0不缩放,>0忽略参数2、3的宽高
 * @return bool|string
 */
function image_resize($imagedata, $width, $height, $per = 0)
{
    // 1 = GIF,2 = JPG,3 = PNG,4 = SWF,5 = PSD,6 = BMP,7 = TIFF(intel byte order),8 = TIFF(motorola byte order),9 = JPC,10 = JP2,11 = JPX,12 = JB2,13 = SWC,14 = IFF,15 = WBMP,16 = XBM
    // 获取图像信息
    list($bigWidth, $bigHight, $bigType) = getimagesizefromstring($imagedata);
    // 缩放比例
    if ($per > 0) {
        $width  = $bigWidth * $per;
        $height = $bigHight * $per;
    }
    // 创建缩略图画板
    $block = imagecreatetruecolor($width, $height);
    // 启用混色模式
    imagealphablending($block, false);
    // 保存PNG alpha通道信息
    imagesavealpha($block, true);
    // 创建原图画板
    $bigImg = imagecreatefromstring($imagedata);
    // 缩放
    imagecopyresampled($block, $bigImg, 0, 0, 0, 0, $width, $height, $bigWidth, $bigHight);
    // 生成临时文件名
    $tmpFilename = uniqid() . '.png';
    // 保存
    switch ($bigType) {
        case 1: imagegif($block, $tmpFilename);
            break;

        case 2: imagejpeg($block, $tmpFilename);
            break;

        case 3: imagepng($block, $tmpFilename);
            break;
    }
    // 销毁
    imagedestroy($block);

    return $tmpFilename;
}

//image_resize(file_get_contents('icon.png'), '', '', 0.5);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值