ndfweb.cn

PHP圖片水印函數:支持以圖片和文字方式添加水印


2011-12-16 03:45:17 (5843)



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

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);
    }
        
    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~9
0:隨機位置,在1~8之間隨機選取一個位置
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函數也可以設置合成的圖片質量。


本文版权:http://www.ndfweb.cn/news-569.html
  NDF俱乐部
  国际域名注册
  建站咨询
简体中文 NDF网站建设淘宝店 | ICO图标在线生成 | 外贸网站建设 | 联系我们
©2007-2024 NDF Corporation 鲁ICP备08005967号 Sitemap - RSSRSS订阅