程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP imagecopy()與imagecopymerge()圖像添加水印

PHP imagecopy()與imagecopymerge()圖像添加水印

編輯:關於PHP編程

圖像添加水印在php中有很多種辦法可以實現,他這些功能都是基於php中的GD庫的,如果沒有開戶GD庫是不可以使用水印功能的。

imagecopymerge() 函數用於拷貝並合並圖像的一部分,成功返回 TRUE ,否則返回 FALSE 。

Windows下開啟PHP的GD庫支持

找到php.ini,打開內容,找到:

;extension=php_gd2.dll

把最前面的分號“;”去掉,再保存即可,如果本來就沒有分號,那就是已經開啟了

基本的語法

bool imagecopymerge( resource dst_im, resource src_im, int dst_x,
int dst_y, int src_x, int src_y, int src_w, int src_h, int pct )

參數說明: 參數 說明

dst_im 目標圖像
src_im 被拷貝的源圖像
dst_x 目標圖像開始 x 坐標
dst_y 目標圖像開始 y 坐標,x,y同為 0 則從左上角開始
src_x 拷貝圖像開始 x 坐標
src_y 拷貝圖像開始 y 坐標,x,y同為 0 則從左上角開始拷貝
src_w (從 src_x 開始)拷貝的寬度
src_h (從 src_y 開始)拷貝的高度
pct 圖像合並程度,取值 0-100 ,當 pct=0 時,實際上什麼也沒做,反之完全合並。

當為 pct = 100 時對於調色板圖像本函數和 imagecopy() 完全一樣

知道了用法,要實現我們的功能就簡單了,用下面的代碼就可以輕松實現

 代碼如下 復制代碼

<?php
header("Content-type: image/jpeg");

//原始圖像
$dst = "images/flower_1.jpg";

//得到原始圖片信息
$dst_im = imagecreatefromjpeg($dst);
$dst_info = getimagesize($dst);

//水印圖像
$src = "images/logo.gif";
$src_im = imagecreatefromgif($src);
$src_info = getimagesize($src);

//水印透明度
$alpha = 30;

//合並水印圖片
imagecopymerge($dst_im,$src_im,$dst_info[0]-$src_info[0],$dst_info[1]-$src_info[1],0,0,$src_info[0],
$src_info[1],$alpha);

//輸出合並後水印圖片
imagejpeg($dst_im);
imagedestroy($dst_im);
imagedestroy($src_im);
?>

新版本之後imagecopymerge函數幾乎不使用了,我們可直接使用imagecopy來生成水印兩個函數的功能是完全一樣的。

//增加水印
$watermark   =1;
$watertype   =2;
$waterstring =''; 
$waterimg="z.png";    //水印圖片
$sFilePath ='aa.jpg';
if($watermark==1)
{
 $image_size = getimagesize($sFilePath); //上傳的圖片
 $water_size = getimagesize($waterimg);  //水印圖片
 $iinfo=getimagesize($sFilePath,$iinfo);
 $nimage=imagecreatetruecolor($image_size[0],$image_size[1]);
 $white=imagecolorallocate($nimage,255,255,255);
 $black=imagecolorallocate($nimage,0,0,0);
 $red=imagecolorallocate($nimage,255,0,0);
 imagefill($nimage,0,0,$white);
 switch ($iinfo[2])
 {
  case 1:
   $simage =imagecreatefromgif($sFilePath);
   break;
  case 2:
   $simage =imagecreatefromjpeg($sFilePath);
   break;
  case 3:
   $simage =imagecreatefrompng($sFilePath);
   break;
//            case 6:
//            $simage =imagecreatefromwbmp($sFilePath);
//            break;
  default:
   die("不支持的文件類型");
   exit;
 }
 
 imagecopy($nimage,$simage,0,0,0,0,$image_size[0],$image_size[1]);
 
 switch($watertype)
 {
  case 1:   //加水印字符串
   imagestring($nimage,2,3,$image_size[1]-15,$waterstring,$black);
   break;
  case 2:   //加水印圖片
   $simage1 =imagecreatefrompng($waterimg);     
   $x= $image_size[0]-$water_size[0];
   $y= $image_size[1]-$water_size[1];
   imagecopy($nimage,$simage1,$x,$y,0,0,240,65);
   imagedestroy($simage1);
   break;
 }
    
 switch ($iinfo[2])
 {
  case 1:
   imagegif($nimage, $sFilePath);
//            imagejpeg($nimage, $sFilePath);
   break;
  case 2:
   imagejpeg($nimage, $sFilePath);
   break;
  case 3:
   imagepng($nimage, $sFilePath);
   break;
//            case 6:
//            imagewbmp($nimage, $sFilePath);
//            //imagejpeg($nimage, $sFilePath);
//            break;
 }
 
 //覆蓋原上傳文件
 imagedestroy($nimage);
 imagedestroy($simage);
}

一個更好的功能,可以生成縮略並且還可以給圖片添加水印


/***
 想操作圖片
 先得把圖片的大小,類型信息得到
 
 水印:就是把指定的水印復制到目標上,並加透明效果
 
 縮略圖:就是把大圖片復制到小尺寸畫面上
 ***/  
 

 代碼如下 復制代碼

class ImageTool { 
    // imageInfo 分析圖片的信息 
    // return array() 
    public static function imageInfo($image) { 
        // 判斷圖片是否存在 
        if (!file_exists($image)) { 
            return false; 
        } 
 
        $info = getimagesize($image); 
 
        if ($info == false) { 
            return false; 
        } 
 
        // 此時info分析出來,是一個數組 
        $img['width'] = $info[0]; 
        $img['height'] = $info[1]; 
        $img['ext'] = substr($info['mime'], strpos($info['mime'], '/') + 1); 
 
        return $img; 
    } 
 
    /*
     加水印功能
     parm String $dst 等操作圖片
     parm String $water 水印小圖
     parm String $save,不填則默認替換原始圖
     */ 
    public static function water($dst, $water, $save = NULL, $pos = 2, $alpha = 50) { 
        // 先保證2個圖片存在 
        if (!file_exists($dst) || !file_exists($water)) { 
            return false; 
        } 
 
        // 首先保證水印不能比待操作圖片還大 
        $dinfo = self::imageInfo($dst); 
        $winfo = self::imageInfo($water); 
 
        if ($winfo['height'] > $dinfo['height'] || $winfo['width'] > $dinfo['width']) { 
            return false; 
        } 
 
        // 兩張圖,讀到畫布上! 但是圖片可能是png,可能是jpeg,用什麼函數讀? 
        $dfunc = 'imagecreatefrom' . $dinfo['ext']; 
        $wfunc = 'imagecreatefrom' . $winfo['ext']; 
 
        if (!function_exists($dfunc) || !function_exists($wfunc)) { 
            return false; 
        } 
 
        // 動態加載函數來創建畫布 
        $dim = $dfunc($dst); 
        // 創建待操作的畫布 
        $wim = $wfunc($water); 
        // 創建水印畫布 
 
        // 根據水印的位置 計算粘貼的坐標 
        switch($pos) { 
            case 0 : 
                // 左上角 
                $posx = 0; 
                $posy = 0; 
                break; 
 
            case 1 : 
                // 右上角 
                $posx = $dinfo['width'] - $winfo['width']; 
                $posy = 0; 
                break; 
 
            case 3 : 
                // 左下角 
                $posx = 0; 
                $posy = $dinfo['height'] - $winfo['height']; 
                break; 
 
            default : 
                $posx = $dinfo['width'] - $winfo['width']; 
                $posy = $dinfo['height'] - $winfo['height']; 
        } 
 
        // 加水印 
        imagecopymerge($dim, $wim, $posx, $posy, 0, 0, $winfo['width'], $winfo['height'], $alpha); 
 
        // 保存 
        if (!$save) { 
            $save = $dst; 
            unlink($dst); 
            // 刪除原圖 
        } 
 
        $createfunc = 'image' . $dinfo['ext']; 
        $createfunc($dim, $save); 
 
        imagedestroy($dim); 
        imagedestroy($wim); 
 
        return true; 
    } 
 
    /**
     thumb 生成縮略圖
     等比例縮放,兩邊留白
     **/ 
    public static function thumb($dst, $save = NULL, $width = 200, $height = 200) { 
        // 首先判斷待處理的圖片存不存在 
        $dinfo = self::imageInfo($dst); 
        if ($dinfo == false) { 
            return false; 
        } 
 
        // 計算縮放比例 
        $calc = min($width / $dinfo['width'], $height / $dinfo['height']); 
 
        // 創建原始圖的畫布 
        $dfunc = 'imagecreatefrom' . $dinfo['ext']; 
        $dim = $dfunc($dst); 
 
        // 創建縮略畫布 
        $tim = imagecreatetruecolor($width, $height); 
 
        // 創建白色填充縮略畫布 
        $white = imagecolorallocate($tim, 255, 255, 255); 
 
        // 填充縮略畫布 
        imagefill($tim, 0, 0, $white); 
 
        // 復制並縮略 
        $dwidth = (int)$dinfo['width'] * $calc; 
        $dheight = (int)$dinfo['height'] * $calc; 
 
        $paddingx = (int)($width - $dwidth) / 2; 
        $paddingy = (int)($height - $dheight) / 2; 
 
        imagecopyresampled($tim, $dim, $paddingx, $paddingy, 0, 0, $dwidth, $dheight, $dinfo['width'],

$dinfo['height']); 
 
        // 保存圖片 
        if (!$save) { 
            $save = $dst; 
            unlink($dst); 
        } 
 
        $createfunc = 'image' . $dinfo['ext']; 
        $createfunc($tim, $save); 
 
        imagedestroy($dim); 
        imagedestroy($tim); 
 
        return true; 
 
    } 
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved