PHP圖片水印函數:圖片和文字水印

支持以圖片和文字兩種方式給圖片添加水印。圖片支持GIF,PNG,JPG三種格式,水印圖片支持PNG和GIFphp

function setWater($imgSrc,$markImg,$markText,$TextColor,$markPos,$fontType,$markType)
{

    $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(!strcmp($markType,"img"))
    {
        if(!file_exists($markImg) || empty($markImg))
        {
            return;
        }
            
        $markImgInfo = @getimagesize($markImg);
        $markImg_w    = $markImgInfo[0];
        $markImg_h    = $markImgInfo[1];
            
        if($srcImg_w < $markImg_w || $srcImg_h < $markImg_h)
        {
            return;
        }
            
        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(!strcmp($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(!strcmp($markType,"img"))
    {
        imagecopy($dst_img, $markim, $x, $y, 0, 0, $logow, $logoh);
        imagedestroy($markim);
    }
        
    if(!strcmp($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);
    } // www.jbxue.com
        
    switch ($srcInfo[2]) 
    { 
        case 1:
            imagegif($dst_img, $imgSrc); 
            break; 
        case 2: 
            imagejpeg($dst_img, $imgSrc); 
            break; 
        case 3: 
            imagepng($dst_img, $imgSrc); 
            break;
        default: 
            die("不支持的水印圖片文件類型"); 
            exit; 
    }
        
    imagedestroy($dst_img);
    imagedestroy($srcim);
}

參數說明:
數組

$imgSrc:目標圖片,可帶相對目錄地址,
函數

$markImg:水印圖片,可帶相對目錄地址,支持PNG和GIF兩種格式,如水印圖片在執行文件mark目錄下,可寫成:mark/mark.gif測試

$markText:給圖片添加的水印文字字體

$TextColor:水印文字的字體顏色網站

$markPos:圖片水印添加的位置,取值範圍:0~9spa

0:隨機位置,在1~8之間隨機選取一個位置code

1:頂部居左 2:頂部居中 3:頂部居右 4:左邊居中索引

5:圖片中心 6:右邊居中 7:底部居左 8:底部居中 9:底部居右圖片

$fontType:具體的字體庫,可帶相對目錄地址

$markType:圖片添加水印的方式,img表明以圖片方式,text表明以文字方式添加水印


代碼註釋:

第4~6行:獲取目標圖片的寬度和高度

第8~22行:根據圖片類型調用不一樣的函數,得到操做圖像標識符

GetImageSize函數知識點:GetImageSize不須要安裝 GD度就可以使用,其返回值數組有四個元素。索引值0是圖片高度。索引值1是圖片的寬度。索引值2是圖片的文件格式,其值1爲GIF格式、2爲JPEG/JPG格式、3爲PNG格式。索引值3爲圖片的高與寬字符串,height=xxx width=yyy。返回的圖片寬度和高度單位都是像素(pixel)

第24~58行:當選擇圖片方式給目標圖片添加水印時,獲取水印圖片的寬度和高度,一般狀況都是網站的logo。若是目標圖片比水印圖片寬度或者高度小或者水印圖片不存在,則跳出這個函數。

return語句知識點:直接return 表示什麼都不返回,直接結束這個函數。也能夠理解成返回 NULL。


第60~77行:當選擇文字方式給目標圖片添加水印時,首先設定水印文字的大小,默認我設置爲16px,你能夠根據須要自行調整字體大小。若是字體文件不存在,跳出函數,最後經過imagettfbbox函數得到此設定格式的文字的虛擬長寬。

imagettfbbox函數知識點:此函數返回一個含有8個單元的數組表示文本外框的四個角,索引值含義:0表明左下角 X 位置,1表明坐下角 Y 位置,2表明右下角 X 位置,3表明右下角 Y 位置,4表明右上角 X 位置,5表明右上角 Y 位置,6表明左上角 X 位置,7表明左上角 Y 位置。此函數同時須要GD 庫和FreeType庫的支持

max函數返回參數中數值最大的值。

第79~125行:根據設定的圖片水印位置計算具體座標值,你能夠根據效果具體細化水印的位置。

第127~129行:新建一個和目標圖片大小一致的圖片。

注:因爲imagecreatetruecolor函數範圍的是一個黑色圖片,因此若是你的目標圖片是透明的,則生成的新圖將不會是透明色。

第131~162行:根據圖片或者文字方式,最終生成添加了水印的圖片。

調用說明:

以函數調用方式調用便可,固然你也能夠以類的方式封裝,或者你也能夠根據須要將此函數進一步細分模塊也能夠。固然你如今這樣用也是沒有任何問題的,我已測試過,請放心使用。

其餘說明:

因爲imagettftext和imagettfbbox函數須要GD庫和FreeType庫的支持,若是你的運行環境不支持GD庫和FreeType庫則文字方式就沒法實現,你能夠用imagestring函數實現給圖片添加文字水印,同時設定下text方式下的$logow和$logoh值便可。

imagejpeg函數也能夠設置合成的圖片質量。

相關文章
相關標籤/搜索