<?php
/**
* 缩略图水印生成类 文字水印 字符编码为 utf-8
* 中文需要处理还字体的问题
* @name MakeMiniature
* @see
* @version 2.1.0 (2016-1-22)
* @author sanshi0815
*/
class MakeMiniature
{
//字体带目录
private $font;
//水印内容 可以是 文字,可以是图片路径,也可以为为空
private $watermark;
//源文件
private $srcFile;
//目标文件
private $dstFile;
//水印类别 0 无水印,1图片水印,2文字水印
private $watetType;
//支持的图片类别当前支持2种
private $imgType=array("jpg","jpeg","png");
//图片打开资源句柄
private $im;
//原始图片类型
private $fileType;
private $errorMsg="";
public function __construct()
{
}
/**
* 获取失败信息
* @author sanshi0815
* @return string 失败信息
*/
public function getErrorMsg()
{
return $this->errorMsg;
}
/**
* 参数设置
* @author sanshi0815
* @param string $font 字体文件带目录文字水印使用
* @param string $watermark 水印文字或者是图片地址
* @param string $srcFile 原始图片地址
* @param string $dstFile 生成新图片地址
* @return null 无返回值
*/
public function set($font,$watermark,$srcFile,$dstFile)
{
$this->font = $font;
$this->watermark = $watermark;
$this->srcFile = $srcFile;
$this->dstFile = $dstFile;
if(empty($this->watermark ))
{
//无水印
$this->watetType = 0;
}elseif(is_file($this->watermark)){
//图片水印
$this->watetType = 1;
}else{
//文字水印
$this->watetType = 2;
}
}
/**
* 图片资源获取 成功返回数组,失败返回false
* @author sanshi0815
* @param string $fileName 图片地址
* @return array r{句柄},t{后缀},w{宽度},h{高度}
*/
private function getResource($fileName)
{
if(!is_file($fileName))
{
$this->errorMsg = "{$fileName} 不存在 line:".__LINE__;
}
$temp = explode('.',$fileName);
$fileType = strtolower(end($temp));
//判断后缀是否是否符合要求
if(!in_array($fileType,$this->imgType))
{
//文件类型不支持
$this->errorMsg = "{$fileName}图片后缀类型不支持 line:".__LINE__;
return false;
}
if($fileType=="jpg" || $fileType=="jpeg")
{
$im=imageCreateFromjpeg($fileName);
}else{
$im=imagecreatefrompng($fileName);
}
if(!$im)
{
//图片初始化失败
$this->errorMsg = "{$fileName}图片初始化资源失败 line:".__LINE__;
return false;
}
//源图片宽
$width=imagesx($im);
//源图片高
$height=imagesy($im);
if(empty($width) || empty($height))
{
//图片高度宽度获取失败
$this->errorMsg = "{$fileName}图片高度或者宽度获取失败 line:".__LINE__;
return false;
}
return array("r"=>$im,"t"=>$fileType,"w"=>$width,"h"=>$height);
}
/**
* 原始图片全局变量设置 成功返回数组,失败返回false
* @author sanshi0815
* @return array w{宽度},h{高度}
*/
private function initSrcImgWH()
{
$temp = $this->getResource($this->srcFile);
if(empty($temp))
{
$this->errorMsg = "图像资源不存在 line:".__LINE__;
return false;
}
$this->fileType = $temp['t'];
$this->im=$temp['r'];
return array("w"=>$temp['w'],"h"=>$temp['h']);
}
/**
* 固定宽度,高度 进行图片缩放
* @author sanshi0815
* @param int $width 生成图片宽度
* @param int $height 生成图片高度
* @return bool 成功为 true,失败为false
*/
public function resetImgWH($width,$height)
{
$temp = $this->initSrcImgWH();
if(empty($temp))
{
$this->errorMsg = "图像资源不存在 line:".__LINE__;
return false;
}
$srcW = $temp['w'];
$srcH = $temp['h'];
$detW = intval($width);
$detH = intval($height);
//生成新的图像资源
$om = $this->getNewImg($srcW,$srcH,$detW,$detH);
$temp = empty($om) ? false : $this->createImg($om,$detW,$detH);
return $temp;
}
/**
* 根据最大高度 进行图片等比缩放
* @author sanshi0815
* @param int $maxHeight 生成图片高度
* @return bool 成功为 true,失败为false
*/
public function resetImgMaxH($maxHeight)
{
$maxHeight = intval($maxHeight);
$temp = $this->initSrcImgWH();
if(empty($temp))
{
$this->errorMsg = "图像资源不存在 line:".__LINE__;
return false;
}
$srcW = $temp['w'];
$srcH = $temp['h'];
//计算缩放比
$scale = round($maxHeight/$srcH,4);
$detW = round($srcW*$scale);
$detH = round($srcH*$scale);
//生成新的图像资源
$om = $this->getNewImg($srcW,$srcH,$detW,$detH);
$temp = empty($om) ? false : $this->createImg($om,$detW,$detH);
return $temp;
}
/**
* 根据最大宽度 进行图片等比缩放
* @author sanshi0815
* @param int $maxWidth 生成图片宽度
* @return bool 成功为 true,失败为false
*/
public function resetImgMaxW($maxWidth)
{
$temp = $this->initSrcImgWH();
if(empty($temp))
{
$this->errorMsg = "图像资源不存在 line:".__LINE__;
return false;
}
$srcW = $temp['w'];
$srcH = $temp['h'];
//计算缩放比
$scale = round($maxWidth/$srcW,4);
$detW = round($srcW*$scale);
$detH = round($srcH*$scale);
//生成新的图像资源
$om = $this->getNewImg($srcW,$srcH,$detW,$detH);
//$om = $this->im;
$temp = empty($om) ? false : $this->createImg($om,$detW,$detH);
return $temp;
}
/**
* 获得缩放后的图片资源句柄
* @author sanshi0815
* @param int $srcW 原始图片宽度
* @param int $srcH 原始图片高度
* @param int $detW 原始图片宽度
* @param int $detH 原始图片高度
* @return bool 成功为 true,失败为false
*/
private function getNewImg($srcW,$srcH,$detW,$detH)
{
$om=imagecreatetruecolor($detW,$detH);//真色彩对gb库有要求
if(empty($om))
{
$this->errorMsg = "imagecreatetruecolor 函数失败 line:".__LINE__;
return false;
}
//ImageCopyResized($om,$im,0,0,0,0,$detW,$detH,$srcW,$srcH);
$temp = imagecopyresampled($om,$this->im,0,0,0,0,$detW,$detH,$srcW,$srcH);
if(empty($temp))
{
$this->errorMsg = "imagecopyresampled 函数失败 line:".__LINE__;
return false;
}
return $om;
}
/**
* 获得图片加文字水印后资源
* @author sanshi0815
* @param resource $im 原始资源
* @param int $detW 原始图片宽度
* @param int $detH 原始图片高度
* @return resource 成功为 水印后的图片资源,失败为false
*/
private function getWatermarkText($im,$detW,$detH)
{
if(!$is_file($this->font))
{
$this->errorMsg = "{$this->font} 字体不存在 line:".__LINE__;
return false;
}
//旋转角度
$angle = 20;
$width = $detW/10;
$size = $detW/8;
$height = $detH;
//echo $height;
$black = imagecolorallocate($im, 0, 0, 0);
$grey = imagecolorallocate($im, 180, 180, 180);
//生成水印次数
$formax = 3;
for($i=$formax;$i>=1;$i--)
{
$height =$height-$detH/($formax+2);
//echo $height."<br/>";
$temp = imagettftext($im, $size, $angle,$width,$height, $grey, $this->font,$this->watermark);
if(empty($temp))
{
$this->errorMsg = "imagettftext 函数失败 line:".__LINE__;
return false;
}
}
return $im;
}
/**
* 获得图片加图片水印后资源
* @author sanshi0815
* @param resource $im 原始资源
* @param int $detW 原始图片宽度
* @param int $detH 原始图片高度
* @return resource 成功为 水印后的图片资源,失败为false
*/
private function getWatermarkPic($im,$detW,$detH)
{
$temp = $this->getResource($this->watermark);
if(empty($temp)) return false;
$wm = $temp['r'];
$src_x = 0;
$src_y = 0;
$src_w = $temp['w'];
$src_h = $temp['h'];
$dst_x = $detW;
$dst_y = $detH;
$height = $dst_y > $src_h ? ($dst_y - $src_h)/2 :0;
$width = $dst_x > $src_w ? ($dst_x - $src_w)/2 : 0;
$temp = imagealphablending($im,true);
if(empty($temp))
{
$this->errorMsg = "imagealphablending 函数失败 line:".__LINE__;
return false;
}
$temp = imagecopymerge($im,$wm,$width,$height,0,0,$src_w,$src_h,70);
if(empty($temp))
{
$this->errorMsg = "imagecopymerge 函数失败 line:".__LINE__;
return false;
}
return $im;
}
/**
* 新图片生成
* @author sanshi0815
* @param resource $im 原始资源
* @param int $detW 原始图片宽度
* @param int $detH 原始图片高度
* @return bool 成功为true,失败为false
*/
private function createImg($im,$detW,$detH)
{
//处理水印
if($this->watetType==2)
{
$om = $this->getWatermarkText($im,$detW,$detH);
}elseif ($this->watetType==1) {
$om = $this->getWatermarkPic($im,$detW,$detH);
}else{
$om = $im;
}
if(empty($om))
{
$this->errorMsg = "图片资源不存在 line:".__LINE__;
return false;
}
$fileType = $this->fileType;
if($fileType=="jpg" || $fileType=="jpeg")
{
$temp=imagejpeg($om,$this->dstFile);
}else{
$temp=imagepng($om,$this->dstFile);
}
return $temp;
}
}
$file=new MakeMiniature();
$file->set("./simhei.ttf","张磊专用","1_1453362028.png","s1_1453362028.png");
$file->resetImgMaxW(800);
?>以前的类 http://blog.csdn.net/sanshi0815/article/details/1604905
以上就介绍了php gd库水印类7年后重构了 支持php7,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号