php 方便水印和缩略图的图形类

2021-01-23 18:40:257

复制代码 代码如下:

/*

*@author夜无眠27262681@qq.com

*copyrighthttp://www.gowake.cn

*/

class img {

function __construct($arg = null) {

$args = func_get_args();

if($arg == null) {

return null;

}

$this->im = call_user_func_array(array($this,'create'),$args);

}

function __call($func,$arg) {

if(function_exists('image'.$func)) {

$funcstr = 'image'.$func;

}elseif (function_exists($func)){

$funcstr = $func;

}else {

error("没有这个类方法或函数");

}

return call_user_func_array($funcstr,$arg);

}

/*

*创建图像

*@param string/int 图片文件路径或者宽度

*@param int 高度,可省略

*@param string 6位16进制整数

*/

function create($arg = null) {

$args = func_get_args();

if(is_file($args[0])) {

$this->file = $args[0];

$size = getimagesize($this->file) or error('图片类型错误');

$this->size = $this->size ? $this->size : $size;

$type = image_type_to_extension($size[2],false);

$this->type = $this->type ? $this->type : $type;

$createfunc = 'imagecreatefrom'.$type;

$im = $createfunc($this->file);

}elseif((int)$args[0]>0 and (int)$args[1]>0) {

$im = imagecreatetruecolor((int)$args[0],(int)$args[1]) or error("对不起,参数错误!");

if(!$args[2]) {

$color = hexdec('7fffffff');

imagecolortransparent($im,$color);

}else {

$color = hexdec(str_replace('#','',$args[2]));

}

$this->size = $this->size ? $this->size : array((int)$args[0] ,(int)$args[1]);

imagefill($im, 1, 1, $color);

}else {

error("对不起,参数错误!");

}

//imagealphablending($im,false);//这两行用来记录透明通道

imagesavealpha($im,true);

imageinterlace($im,true);//开启隔行扫描

return $im;

}

/*

*生成缩略图

*@param int $w 新图片的宽度

*@param int $h 新图片的宽度

*@param string/bool $color 可选,新图片的背景色,false或空为透明

*@param bool $lashen 可选,是否拉伸,默认不拉伸

*/

function suolue($w = null,$h = null,$color = false,$lashen = false) {

$w_o = imagesx($this->im);

$h_o = imagesy($this->im);

if($w == null and $h != null) {

$w = $h * $w_o/$h_o;

}elseif ($w != null and $h == null){

$h = $w * $h_o/$w_o;

}

$this->size = null;

$im = $this->create($w,$h,$color);

$w_n = $w;

$h_n = $h;

if($w_o/$h_o > $w/$h) {

$h_n = $w*$h_o/$w_o;

$y = ($h-$h_n)/2;

}elseif ($w_o/$h_o < $w/$h){

$w_n = $h*$w_o/$h_o;

$x = ($w-$w_n)/2;

}

if($lashen) {

$w_n = $w;

$h_n = $h;

$x = 0;

$y = 0;

}

imagecopyresampled($im,$this->im,$x,$y,0,0,$w_n,$h_n,$w_o,$h_o);

//imagedestroy($this->im);

$this->im = $im;

return $im;

}

/*

*在图片上写字

*@param string $str 要写的字符串

*@param array $arg 字符串相关的参数,为一个关联数组,left 为距左边距离,right为距右边距离,left优先,top为距顶部距离,bottom为距底部距离,top优先;angle为角度,color为6位数16进制颜色,touming为文字透明度,font为字体文件

*/

function write($str = '' , $arg = array()) {

$size = $arg['size'] ? $arg['size'] : 20;

$angle = $arg['angle'] ? $arg['angle'] : 0 ;

$color = $arg['color'] ? $arg['color'] : '000000';

$touming = $arg['touming'] ? $arg['touming'] : 100;

$touming = dechex((100-$touming)*127/100);

$color = hexdec($touming.str_replace("#","",$color));

$font = $arg['font'] ? $arg['font'] : 'arial.ttf';

$boxarr = imagettfbbox($size,$angle,$font,$str);

$w = imagesx($this->im);

$h = imagesy($this->im);

$x_l = $x_r = $boxarr[0];

$y_t = $y_b = $boxarr[1];

for($i=0;$i<7;$i = $i+2) {

$x_l = $boxarr[$i] < $x_l ? $boxarr[$i] : $x_l;

$x_r = $boxarr[$i] > $x_r ? $boxarr[$i] : $x_r;

$y_t = $boxarr[$i+1] < $y_t ? $boxarr[$i+1] : $y_t;

$y_b = $boxarr[$i+1] > $y_b ? $boxarr[$i+1] : $y_b;

}

$width = $x_r - $x_l;

$height = $y_b - $y_t;

/*获取精确偏移量*/

$im = $this->create($width*4,$height*4);

$tm = hexdec('7fffffff');

imagettftext($im,$size,$angle,$width*2,$height*2,$color,$font,$str);

for($i=0;$i

for($ii=0;$ii

if(imagecolorat($im,$i,$ii) != $tm) {

$x_l = $i;

break(2);

}

}

}

for($i=0;$i

for($ii=$x_l;$ii

if(imagecolorat($im,$ii,$i) != $tm) {

$y_t = $i;

break(2);

}

}

}

for($i=$width*4-1;$i>0;$i--) {

for($ii=$y_t;$ii

if(imagecolorat($im,$i,$ii) != $tm) {

$x_r = $i;

break(2);

}

}

}

for($i=$height*4-1;$i>0;$i--) {

for($ii=$x_l;$ii<=$x_r;$ii++) {

if(imagecolorat($im,$ii,$i) != $tm) {

$y_b = $i;

break(2);

}

}

}

$x_off = $x_l - $width*2;

$y_off = $y_b - $height*2;

$width = $x_r - $x_l; //精确宽度

$height = $y_b - $y_t; //精确高度

imagedestroy($im);

if(isset($arg['left'])) {

$x = (int)$arg['left'] - $x_off;

}elseif (isset($arg['right'])){

$x = $w - (int)$arg['right'] - $width - $x_off;

}else {

$x = ($w - $width)/2 - $x_off;

}

if(isset($arg['top'])) {

$y = (int)$arg['top'] - $y_off + $height;

}elseif (isset($arg['bottom'])){

$y = $h - (int)$arg['bottom'] - $y_off;

}else {

$y = ($h + $height)/2 - $y_off;

}

imagettftext($this->im,$size,$angle,$x,$y,$color,$font,$str);

return $this->im;

}

/*

*合并图片(如图片水影)

*@param string/resource $file 图片文件路径或这图片标识符

*@param array $arg 字符串相关的参数,为一个关联数组,left 为距左边距离,right为距右边距离,left优先,top为距顶部距离,bottom为距底部距离,top优先;touming为文字透明度

*/

function merge($file,$arg = array()) {

if(is_file($file)) {

$imc = $this->create($file);

}elseif(gettype($file)=='resource') {

$imc = $file;

}else {

error("没有图片");

}

$touming = $arg['touming'] ? (int)$arg['touming'] : 100 ;

$w = imagesx($this->im);

$h = imagesy($this->im);

$width = imagesx($imc);

$height = imagesy($imc);

if(isset($arg['left'])) {

$x = (int)$arg['left'];

}elseif (isset($arg['right'])){

$x = $w - (int)$arg['right'] - $width;

}else {

$x = ($w - $width)/2;

}

if(isset($arg['top'])) {

$y = (int)$arg['top'];

}elseif (isset($arg['bottom'])){

$y = $h - $height - $arg['bottom'];

}else {

$y = ($h - $height)/2;

}

imagecopymergegray($this->im,$imc,$x,$y,0,0,$width,$height,$touming);

}

/*

*输出图片

*@param string $type

*@param string $filename 要转存的文件路径

*@param int $zhiliang jpeg图片特有的,图像清晰度

*/

function display($type = null,$filename = null,$zhiliang = null) {

if($type == null) {

$type = $this->type ? $this->type : 'jpg';

}

if(($type == 'jpeg' or $type == 'jpg') and $zhiliang == null) {

$type = 'jpeg';

$zhiliang = 100;

}

if($filename == null) {

header('Content-type: image/'.$type);

}

$displayfunc = 'image'.$type;

$displayfunc($this->im,$filename,$zhiliang);

imagedestroy($this->im);

}

function randcolor($a,$b) {

$a = $a>255 ? 255 : (int)$a;

$a = $a<0 ? 0 : (int)$a;

$b = $b>255 ? 255 : (int)$b;

$b = $b<0 ? 0 : (int)$b;

for($i=0;$i<3;$i++) {

$color .= str_pad(dechex(mt_rand($a,$b)), 2, "0", STR_PAD_LEFT);

}

return $color;

}

}

/*

function error($msg,$debug = false) {

$err = new Exception($msg);

$str = "

\n错误:\n".print_r($err->getTrace(),1)."\n

";

if($debug == true) {

file_put_contents(date('Y-m-d').".log",$str);

return $str;

}else{

die($str);

}

}

*/

?>

这是简单的用法实例

复制代码 代码如下:

$img = new img('a.png');

$m = $img->im;

$im = $img->suolue(100);

$img->im = $m;

$img->suolue(300);

$img->merge($m,array('left'=>0,'top'=>0,'touming'=>60));

$img->merge($im,array('right'=>0,'top'=>0,'touming'=>60));

$img->merge($im,array('left'=>0,'bottom'=>0,'touming'=>60));

$img->merge($im,array('right'=>0,'bottom'=>0,'touming'=>60));

$img->write("春天来了",array('left'=>0,'top'=>0,'size'=>30,'color'=>$img->randcolor(0,180),'angle'=>-45,'font'=>'simfang.ttf','touming'=>80));

$img->write("春天来了",array('left'=>0,'bottom'=>0,'size'=>30,'color'=>$img->randcolor(0,180),'angle'=>45,'font'=>'simfang.ttf','touming'=>80));

$img->write("春天来了",array('right'=>0,'bottom'=>0,'size'=>30,'color'=>$img->randcolor(0,180),'angle'=>-45,'font'=>'simfang.ttf','touming'=>80));

$img->write("春天来了",array('right'=>0,'top'=>0,'size'=>30,'color'=>$img->randcolor(0,180),'angle'=>45,'font'=>'simfang.ttf','touming'=>80));

$img->display("gif");

点击这里复制本文地址

以上内容由聚米学院网友整理呈现,如对侵犯您的权益,请联系邮箱:fzsbm@qq.com

php trace 图形,php 方便水印和缩略图的图形类相关推荐

  1. 图片上传(加水印、缩略图、远程保存)的简单例子

    图片上传(加水印.缩略图.远程保存)的简单例子(应用于51aspx.com) 该源码下载地址:http://51aspx.com/CV/ImageUpload 今天看到xiongeee发的文章使用使用 ...

  2. php分析图片水印,PHP开发的文字水印,缩略图,图片水印实现类与用法示例

    本文实例讲述了PHP开发的文字水印,缩略图,图片水印实现类与用法.分享给大家供大家参考,具体如下: 1.实现类ImageToTest.class.php参考代码 class ImageToTest { ...

  3. 图形测试分析毫无头绪?HarmonyOS图形栈测试技术帮你解决

    作者:huangran,图形图像技术专家 应用开发以后无法知道性能瓶颈的根因是什么?滑动卡顿.白块产生的原因是什么?代码写完之后,不知道如何优化让它表现地更好-- 我们发现,如今测试人员的需求已经不只 ...

  4. 详解matlab图形绘制技术 下载,详解MATLAB图形绘制技术

    第1章 MATLAB的基本知识 1.1 MATLAB的认识 1.2 MATLAB的特点 1.2.1 MATLAB的普遍特点 1.2.2 MATLAB R2009a的新特点 1.3 MATLAB的工作环 ...

  5. 成功解决⑧NVIDIA安装程序无法继续 此NVIDL驱动程序与此Windows版本不兼容。 此图形驱动程序无法找到兼吝的图形硬件。

    成功解决⑧NVIDIA安装程序无法继续 此NVIDL驱动程序与此Windows版本不兼容. 此图形驱动程序无法找到兼吝的图形硬件. 目录 解决问题 解决思路 解决方法 解决问题 NVIDIA安装程序无 ...

  6. lisp中怎样调取图形_越玩越聪明的图形思维游戏

    填合适的数字 仔细观察下列表格,数字以均衡的形式成一条线移动,数字间的变化有一定的规律性,你能说出空格处的数字应该填什么吗? 数字中的秘密 观察下面图形,找出图形数字中的秘密,挑选出与众不同的那个数字 ...

  7. c语言中图形驱动程序功能_C / C ++中的图形:一些更有趣的功能

    c语言中图形驱动程序功能 In this Advance Learning Tutorial of C / C ++ today, we are going to tell you about som ...

  8. 用python可以画的可爱的图形_用Python的Turtple画图形

    不知道各位是否还记得在小学或者初中的时候,我们接触过一种语言叫做logo语言,这个语言可以画正方形,画三角形,画圆.而用Python画图形也有点类似logo语言的意思. 在画图之前,我们需要启动一个模 ...

  9. 计算机评游戏图形低,5常见的PC游戏图形选项说明 | MOS86

    PC游戏提供了看似无尽的图形选项屏幕.每个都涉及图形质量和性能之间的折衷,但它 除了在游戏内切换这些设置外,您一般可以从图形驱动程序中强制它们 分辨率相关文章图片4tupian为什么要使用显示器?现代 ...

最新文章

  1. 妙招避免网络IP地址被非法修改
  2. 自动化运维之SaltStack实践
  3. Data Mining的十种分析方法
  4. SQL Server之游标的基础知识
  5. Oracle创建pfile spfile 文件及其恢复
  6. kind富文本编辑器_在VueJs中集成UEditor 富文本编辑器
  7. linux常用命令实战
  8. (盒子模型常见问题)外边距合并问题,嵌套盒子边距塌陷问题解决
  9. jetty:Address already in use: bind
  10. TypeError: '
  11. 读“我为什么不要应届毕业生”
  12. 一次澄清:数据分析思维五大误区
  13. 两种方式打开jar文件
  14. windows计算器_计算Windows计算器中的错误
  15. c语言 程序段 数据段,C程序段(代码段、数据段、BSS段以及堆栈)的详解
  16. 判断是否是IE浏览器或IE内核浏览器
  17. 键盘RK987说明书
  18. 调查:听取当前用户的意见(并改进),是为什么?
  19. DELL台式机安装Centos7无法正常展示图形化安装界面
  20. 华为电脑如何投屏到电视linux,华为mate10/mate10pro怎么投屏至电视或电脑上面?

热门文章

  1. 重学前端-学习笔记-JavaScript对象
  2. 工具类静态方法注入dao
  3. SAP R3 Create Client: T-code:SCC4
  4. unity如何停止不用字符串方式开启协程的方法
  5. win7编程接口的一些变化
  6. CCF201312-5 I’m stuck!(100分)
  7. 软路试--就像一棵树活着
  8. Android短信操作(通过内容提供者)
  9. Unity3d碰撞检测始终是个问题。
  10. Android maps应用