PHP imagecopy()與imagecopymerge()映像添加浮水印_PHP教程

來源:互聯網
上載者:User
映像添加浮水印在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() 完全一樣

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

代碼如下 複製代碼

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;

}

}

http://www.bkjia.com/PHPjc/632955.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/632955.htmlTechArticle映像添加浮水印在php中有很多種辦法可以實現,他這些功能都是基於php中的GD庫的,如果沒有開戶GD庫是不可以使用浮水印功能的。 imagecopymerge...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.