php实现的通用图片处理类
程序员文章站
2022-10-16 19:27:59
本文实例讲述了php实现的通用图片处理类。分享给大家供大家参考。具体如下:
该图片处理函数功能:缩放、剪切、相框、水印、锐化、旋转、翻转、透明度、反色,处理并保存历史记录...
本文实例讲述了php实现的通用图片处理类。分享给大家供大家参考。具体如下:
该图片处理函数功能:缩放、剪切、相框、水印、锐化、旋转、翻转、透明度、反色,处理并保存历史记录的思路:当有图片有改动时自动生成一张新图片,命名方式可以考虑在原图片的基础上加上步骤,例如:图片名称+__第几步。 在一些需要图片高级处理功能的web应用中,可以参考这个类。
<?php class picture { var $picture_url;//要处理的图片 var $dest_url="temp__01.jpg";//生成目标图片位置 var $picture_create;//要创建的图片 var $ture_color;//新建一个真彩图象 var $picture_width;//原图片宽度 var $picture_height;//原图片高度 /* 水印的类型,默认的为水印文字 */ var $mark_type=1; var $word;//经过utf-8后的文字 var $word_x;//文字横坐标 var $word_y;//文字纵坐标 var $font_type;//字体类型 var $font_size="12";//字体大小 var $font_word;//文字 var $angle=0;//文字的角度,默认为0 var $font_color="#000000";//文字颜色 var $font_path="font/simkai.ttf";//字体库,默认为宋体 var $force_url;//水印图片 var $force_x=0;//水印横坐标 var $force_y=0;//水印纵坐标 var $force_start_x=0;//切起水印的图片横坐标 var $force_start_y=0;//切起水印的图片纵坐标 var $picture_type;//图片类型 var $picture_mime;//输出的头部 /* 缩放比例为1的话就按缩放高度和宽度缩放 */ var $zoom=1;//缩放类型 var $zoom_multiple;//缩放比例 var $zoom_width;//缩放宽度 var $zoom_height;//缩放高度 /* 裁切,按比例和固定长度、宽度 */ var $cut_type=1;//裁切类型 var $cut_x=0;//裁切的横坐标 var $cut_y=0;//裁切的纵坐标 var $cut_;//裁切的宽度 var $cut_height=100;//裁切的高度 /* 锐化 */ var $sharp="7.0";//锐化程度 /* 透明度处理 */ var $alpha='100';//透明度在0-127之间 var $alpha_x="90"; var $alpha_y="50"; /* 任意角度旋转 */ var $circumrotate="90.0";//注意,必须为浮点数 /* 出错信息 */ var $error=array( 'unalviable'=>'没有找到相关图片!' ); /* 构造函数:函数初始化 */ function __construct($picture_url) { $this->get_info($picture_url); } function get_info($picture_url) { /* 处理原图片的信息,先检测图片是否存在,不存在则给出相应的信息 */ @$size=getimagesize($picture_url); if(!$size) { exit($this->error['unalviable']); } //得到原图片的信息类型、宽度、高度 $this->picture_mime=$size['mime']; $this->picture_; $this->picture_height=$size[1]; //创建图片 switch($size[2]) { case 1: $this->picture_create=imagecreatefromgif($picture_url); $this->picture_type="imagejpeg"; $this->picture_ext="jpg"; break; case 2: $this->picture_create=imagecreatefromjpeg($picture_url); $this->picture_type="imagegif"; $this->picture_ext="gif"; break; case 3: $this->picture_create=imagecreatefrompng($picture_url); $this->picture_type="imagepng"; $this->picture_ext="png"; break; } /* 文字颜色转换16进制转换成10进制 */ preg_match_all("/([0-f]){2,2}/i",$this->font_color,$matches); if(count($matches)==3) { $this->red=hexdec($matches[0][0]); $this->green=hexdec($matches[0][1]); $this->blue=hexdec($matches[0][2]); } } //end of __construct /* 将16进制的颜色转换成10进制的(r,g,b) */ function hex2dec() { preg_match_all("/([0-f]){2,2}/i",$this->font_color,$matches); if(count($matches)==3) { $this->red=hexdec($matches[0][0]); $this->green=hexdec($matches[0][1]); $this->blue=hexdec($matches[0][2]); } } //缩放类型 function zoom_type($zoom_type) { $this->zoom=$zoom_type; } //对图片进行缩放,如果不指定高度和宽度就进行缩放 function zoom() { //缩放的大小 if($this->zoom==0) { $this->zoom_;gt;picture_width * $this->zoom_multiple; $this->zoom_height=$this->picture_height * $this->zoom_multiple; } //新建一个真彩图象 $this->true_color=imagecreatetruecolor($this->zoom_width,$this->zoom_height); $white=imagecolorallocate($this->true_color,255,255,255); imagefilledrectangle($this->true_color,0,0,$this->zoom_width,$this->zoom_height,$white); imagecopyresized($this->true_color,$this->picture_create,0,0,0,0,$this->zoom_width,$this->zoom_height,$this->picture_width,$this->picture_height); } //end of zoom //裁切图片,按坐标或自动 function cut() { $this->true_color=imagecreatetruecolor($this->cut_width,$this->cut_width); imagecopy($this->true_color,$this->picture_create, 0, 0, $this->cut_x, $this->cut_y,$this->cut_width,$this->cut_height); } //end of cut /* 在图片上放文字或图片 水印文字 */ function _mark_text() { $this->true_color=imagecreatetruecolor($this->picture_width,$this->picture_height); $this->word=mb_convert_encoding($this->font_word,'utf-8','gb2312'); /* 取得使用 truetype 字体的文本的范围 */ $temp = imagettfbbox($this->font_size,0,$this->font_path,$this->word); $word_length=strlen($this->word); $word_width =$temp[2] - $temp[6]; $word_height =$temp[3] - $temp[7]; /* 文字水印的默认位置为右下角 */ if($this->word_x=="") { $this->word_x=$this->picture_width-$word_width; } if($this->word_y=="") { $this->word_y=$this->picture_height-$word_height; } imagesettile($this->true_color,$this->picture_create); imagefilledrectangle($this->true_color,0,0,$this->picture_width,$this->picture_height,img_color_tiled); $text2=imagecolorallocate($this->true_color,$this->red,$this->green,$this->blue); imagettftext($this->true_color,$this->font_size,$this->angle,$this->word_x,$this->word_y,$text2,$this->font_path,$this->word); } /* 水印图片 */ function _mark_picture() { /* 获取水印图片的信息 */ @$size=getimagesize($this->force_url); if(!$size) { exit($this->error['unalviable']); } $force_picture_; $force_picture_height=$size[1]; //创建水印图片 switch($size[2]) { case 1: $force_picture_create=imagecreatefromgif($this->force_url); $force_picture_type="gif"; break; case 2: $force_picture_create=imagecreatefromjpeg($this->force_url); $force_picture_type="jpg"; break; case 3: $force_picture_create=imagecreatefrompng($this->force_url); $force_picture_type="png"; break; } /* 判断水印图片的大小,并生成目标图片的大小,如果水印比图片大,则生成图片大小为水印图片的大小。否则生成的图片大小为原图片大小。 */ $this->new_picture=$this->picture_create; if($force_picture_width>$this->picture_width) { $create_;gt;force_start_x; } else { $create_;gt;picture_width; } if($force_picture_height>$this->picture_height) { $create_height=$force_picture_height-$this->force_start_y; } else { $create_height=$this->picture_height; } /* 创建一个画布 */ $new_picture_create=imagecreatetruecolor($create_width,$create_height); $white=imagecolorallocate($new_picture_create,255,255,255); /* 将背景图拷贝到画布中 */ imagecopy($new_picture_create, $this->picture_create, 0, 0, 0, 0,$this->picture_width,$this->picture_height); /* 将目标图片拷贝到背景图片上 */ imagecopy($new_picture_create, $force_picture_create, $this->force_x, $this->force_y, $this->force_start_x, $this->force_start_y,$force_picture_width,$force_picture_height); $this->true_color=$new_picture_create; } //end of mark function alpha_() { $this->true_color=imagecreatetruecolor($this->picture_width,$this->picture_height); $rgb="#cdcdcd"; $tran_color="#000000"; for($j=0;$j<=$this->picture_height-1;$j++) { for ($i=0;$i<=$this->picture_width-1;$i++) { $rgb = imagecolorat($this->picture_create,$i,$j); $r = ($rgb >> 16) & 0xff; $g = ($rgb >> 8) & 0xff; $b = $rgb & 0xff; $now_color=imagecolorallocate($this->picture_create,$r,$g,$b); if ($now_color==$tran_color) { continue; } else { $color=imagecolorallocatealpha($this->picture_create,$r,$g,$b,$alpha); imagesetpixel($this->picture_create,$alpha_x+$i,$alpha_y+$j,$color); } $this->true_color=$this->picture_create; } } } /* 图片旋转: 沿y轴旋转 */ function turn_y() { $this->true_color=imagecreatetruecolor($this->picture_width,$this->picture_height); for ($x = 0; $x < $this->picture_width; $x++) { imagecopy($this->true_color, $this->picture_create, $this->picture_width - $x - 1, 0, $x, 0, 1, $this->picture_height); } } /* 沿x轴旋转 */ function turn_x() { $this->true_color=imagecreatetruecolor($this->picture_width,$this->picture_height); for ($y = 0; $y < $this->picture_height; $y++) { imagecopy($this->true_color, $this->picture_create, 0, $this->picture_height - $y - 1, 0, $y, $this->picture_width, 1); } } /* 任意角度旋转 */ function turn() { $this->true_color=imagecreatetruecolor($this->picture_width,$this->picture_height); imagecopyresized($this->true_color,$this->picture_create,0,0,0,0,$this->picture_width,$this->picture_height,$this->picture_width,$this->picture_height); $white=imagecolorallocate($this->true_color,255,255,255); $this->true_color=imagerotate ($this->true_color, $this->circumrotate, $white); } /* 图片锐化 */ function sharp() { $this->true_color=imagecreatetruecolor($this->picture_width,$this->picture_height); $cnt=0; for ($x=0; $x<$this->picture_width; $x++) { for ($y=0; $y<$this->picture_height; $y++) { $src_clr1 = imagecolorsforindex($this->true_color, imagecolorat($this->picture_create, $x-1, $y-1)); $src_clr2 = imagecolorsforindex($this->true_color, imagecolorat($this->picture_create, $x, $y)); $r = intval($src_clr2["red"]+$this->sharp*($src_clr2["red"]-$src_clr1["red"])); $g = intval($src_clr2["green"]+$this->sharp*($src_clr2["green"]-$src_clr1["green"])); $b = intval($src_clr2["blue"]+$this->sharp*($src_clr2["blue"]-$src_clr1["blue"])); $r = min(255, max($r, 0)); $g = min(255, max($g, 0)); $b = min(255, max($b, 0)); if (($dst_clr=imagecolorexact($this->picture_create, $r, $g, $b))==-1) $dst_clr = imagecolorallocate($this->picture_create, $r, $g, $b); $cnt++; if ($dst_clr==-1) die("color allocate faile at $x, $y ($cnt)."); imagesetpixel($this->true_color, $x, $y, $dst_clr); } } } /* 将图片反色处理?? */ function return_color() { /* 创建一个画布 */ $new_picture_create=imagecreate($this->picture_width,$this->picture_height); $white=imagecolorallocate($new_picture_create,255,255,255); /* 将背景图拷贝到画布中 */ imagecopy($new_picture_create, $this->picture_create, 0, 0, 0, 0,$this->picture_width,$this->picture_height); $this->true_color=$new_picture_create; } /* 生成目标图片并显示 */ function show() { // 判断浏览器,若是ie就不发送头 if(isset($_server['http_user_agent'])) { $ua = strtoupper($_server['http_user_agent']); if(!preg_match('/^.*msie.*\)$/i',$ua)) { header("content-type:$this->picture_mime"); } } $out=$this->picture_type; $out($this->true_color); } /* 生成目标图片并保存 */ function save_picture() { // 以 jpeg 格式将图像输出到浏览器或文件 $out=$this->picture_type; if(function_exists($out)) { // 判断浏览器,若是ie就不发送头 if(isset($_server['http_user_agent'])) { $ua = strtoupper($_server['http_user_agent']); if(!preg_match('/^.*msie.*\)$/i',$ua)) { header("content-type:$this->picture_mime"); } } if(!$this->true_color) { exit($this->error['unavilable']); } else { $out($this->true_color,$this->dest_url); $out($this->true_color); } } } /* 析构函数:释放图片 */ function __destruct() { /*释放图片*/ imagedestroy($this->true_color); imagedestroy($this->picture_create); } //end of class } ?>
希望本文所述对大家的php程序设计有所帮助。
上一篇: 周鸿祎:人工智能才起步 谈真正的“商业化”还为之过早
下一篇: 测谎仪:微软机器学习的品牌崛起之路