php方便水印和缩略图的图形类
PHP 图形 方便 水印 缩略图
2023-06-13 09:14:09 时间
<?php
/*
*@author 夜无眠 27262681@qq.com
*copyright http://www.gowake.cn
*/
classimg{
function__construct($arg=null){
$args=func_get_args();
if($arg==null){
returnnull;
}
$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("没有这个类方法或函数");
}
returncall_user_func_array($funcstr,$arg);
}
/*
*创建图像
*@paramstring/int图片文件路径或者宽度
*@paramint高度,可省略
*@paramstring6位16进制整数
*/
functioncreate($arg=null){
$args=func_get_args();
if(is_file($args[0])){
$this->file=$args[0];
$size=getimagesize($this->file)orerror("图片类型错误");
$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]>0and(int)$args[1]>0){
$im=imagecreatetruecolor((int)$args[0],(int)$args[1])orerror("对不起,参数错误!");
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;
}
/*
*生成缩略图
*@paramint$w新图片的宽度
*@paramint$h新图片的宽度
*@paramstring/bool$color可选,新图片的背景色,false或空为透明
*@parambool$lashen可选,是否拉伸,默认不拉伸
*/
functionsuolue($w=null,$h=null,$color=false,$lashen=false){
$w_o=imagesx($this->im);
$h_o=imagesy($this->im);
if($w==nulland$h!=null){
$w=$h*$w_o/$h_o;
}elseif($w!=nulland$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;
}
/*
*在图片上写字
*@paramstring$str要写的字符串
*@paramarray$arg字符串相关的参数,为一个关联数组,left为距左边距离,right为距右边距离,left优先,top为距顶部距离,bottom为距底部距离,top优先;angle为角度,color为6位数16进制颜色,touming为文字透明度,font为字体文件
*/
functionwrite($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<$width*4;$i++){
for($ii=0;$ii<$height*4;$ii++){
if(imagecolorat($im,$i,$ii)!=$tm){
$x_l=$i;
break(2);
}
}
}
for($i=0;$i<$height*4;$i++){
for($ii=$x_l;$ii<$width*4;$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<$height*4;$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;
}
/*
*合并图片(如图片水影)
*@paramstring/resource$file图片文件路径或这图片标识符
*@paramarray$arg字符串相关的参数,为一个关联数组,left为距左边距离,right为距右边距离,left优先,top为距顶部距离,bottom为距底部距离,top优先;touming为文字透明度
*/
functionmerge($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);
}
/*
*输出图片
*@paramstring$type
*@paramstring$filename要转存的文件路径
*@paramint$zhiliangjpeg图片特有的,图像清晰度
*/
functiondisplay($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);
}
functionrandcolor($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;
}
}
/*
functionerror($msg,$debug=false){
$err=newException($msg);
$str="<pre>\n<spanstyle="color:red"style="color:red">错误:</span>\n".print_r($err->getTrace(),1)."\n</pre>";
if($debug==true){
file_put_contents(date("Y-m-d").".log",$str);
return$str;
}else{
die($str);
}
}
*/
?>
这是简单的用法实例
$img=newimg("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");
相关文章
- php函数笔记
- php模糊查询技术「建议收藏」
- query.php?sl=,stripslashes_deep().?php stripslashes?php stripslashes和addsl
- PHP天坑总结
- typecho去掉index.php
- windows 下 PHP 的 redis 扩展安装
- PHP中PDO的基本使用
- Linux上运行PHP的简易方法(linux如何运行php)
- 使用PHP操作Redis的入门实践(php中使用redis)
- 使用PHP执行Linux脚本:简单而快速!(php执行linux脚本)
- Oracle与PHP:实现服务器端程序互通(oracle和php)
- 安装完美:PHP与MySQL的默契(php和mysql安装)
- 妙用PHP:迅速连接Oracle数据库(php连接oracle数据库)
- PHP原生编程实现MySQL数据库连接(php原生连接mysql)
- 让Linux帮助启动PHP服务(linux启动php)
- 使用PHP驱动程序实现与SQL Server数据库的连接(php连接sqlserver)
- Linux环境下轻松配置PHP:简单指南(linux下配置php)
- 一个用mysql_odbc和php写的serach数据库程序
- [PHP]实用函数2
- PHP反向排序和随机排序代码
- php入门学习知识点六PHP文件的读写操作代码
- php共享内存段示例分享
- php中hashtable实现示例分享
- PHP中比较两个字符串找出第一个不同字符位置例子
- PHP遍历目录函数opendir()、readdir()、closedir()、rewinddir()总结
- php使用Cookie控制访问授权的方法
- php中用memcached实现页面防刷新功能
- php设计模式之简单工厂模式详解