資安

PHP利用GD庫給圖片添加水印

/*
 * 添加水印
 * $imgSrc:目標圖片,可帶相對目錄地址,
 * $markImg:水印圖片,可帶相對目錄地址,支持PNG和GIF兩種格式,如水印圖片在執行文件mark目錄下,可寫成:mark/mark.gif
 * $markPos:圖片水印添加的位置,取值範圍:0~9
 * 0:循環平鋪水印
 * 1:頂部居左 2:頂部居中 3:頂部居右 4:左邊居中
 * 5:圖片中心 6:右邊居中 7:底部居左 8:底部居中 9:底部居右
 * */
protected static function addWatermark($imgSrc, $markImg, $markPos = 0)
{
    //如果圖片不存在或者logo不存在則不處理
    if (!file_exists($imgSrc) || !file_exists($markImg)) {

        return [
            'status' => false,
            'message' => '目標圖片或水印圖片不存在!'
        ];
    }
    //獲取圖、水印 寬高類型
    list($srcImg_w, $srcImg_h, $srcImg_t) = getimagesize($imgSrc);
    list($markImg_w, $markImg_h, $markImg_t) = getimagesize($markImg);

    if ($srcImg_w < $markImg_w || $srcImg_h < $markImg_h) {

        return [
            'status' => false,
            'message' => '水印圖片尺寸不能大於目標圖片尺寸!'
        ];
    }

    switch ($srcImg_t) {

        case 1:
            $srcim = imagecreatefromgif($imgSrc);
            break;
        case 2:
            $srcim = imagecreatefromjpeg($imgSrc);
            break;
        case 3:
            $srcim = imagecreatefrompng($imgSrc);
            break;
        default:
            return [
                'status' => false,
                'message' => '不支持的圖片文件類型!'
            ];
    }

    switch ($markImg_t) {

        case 1:
            $markim = imagecreatefromgif($markImg);
            break;
        case 2:
            $markim = imagecreatefromjpeg($markImg);
            break;
        case 3:
            $markim = imagecreatefrompng($markImg);
            break;
        default:
            return [
                'status' => false,
                'message' => '不支持的圖片文件類型!'
            ];
    }

    $logow = $markImg_w;
    $logoh = $markImg_h;

    $dst_img = imagecreatetruecolor($srcImg_w, $srcImg_h);

    imagecopy($dst_img, $srcim, 0, 0, 0, 0, $srcImg_w, $srcImg_h);

    imagedestroy($srcim);

    if ($markPos) {
        //圖片水印添加的位置
        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:
                return [
                    'status' => false,
                    'message' => '此位置不支持!'
                ];
        }

        imagecopy($dst_img, $markim, $x, $y, 0, 0, $logow, $logoh);

    } else {
        //循環平鋪水印
        for ($x = 0; $x < $srcImg_w; $x++) {
            for ($y = 0; $y < $srcImg_h; $y++) {
                imagecopy($dst_img, $markim, $x, $y, 0, 0, $logow, $logoh);
                $y += $logoh;
            }
            $x += $logow;
        }
    }

    imagedestroy($markim);

    switch ($srcImg_t) {

        case 1:
            $status = imagegif($dst_img, $imgSrc);
            break;
        case 2:
            $status = imagejpeg($dst_img, $imgSrc);
            break;
        case 3:
            $status = imagepng($dst_img, $imgSrc);
            break;
        default:
            $status = false;
    }

    imagedestroy($dst_img);

    if ($status) {
        $res = [
            'status' => true,
            'message' => '添加水印圖片成功!'
        ];
    } else {
        $res = [
            'status' => false,
            'message' => '添加水印圖片失敗!'
        ];
    }

    return $res;
}

Leave a Reply

Your email address will not be published. Required fields are marked *