Php图像处理类代码分享


Posted in PHP onJanuary 19, 2012

目前只实现了三个功能:1:图片缩放,2:图片裁剪,3:加图片水印
在实例化中,通过给第二个参数传不同的值,从而实现不同的功能

<?php 
include "image.class.php"; 
$image=new image("2.png", 1, "300", "500", "5.png"); //使用图片缩放功能 
$image=new image("2.png", 2, "0,0", "50,50", "5.png"); //使用图片裁剪功能 
$image=new image("2.png", 3, "1.png", "0", "5.png"); //使用加图片水印功能 
$image->outimage(); 
?>

PHP代码
<?php 
/*已知问题:1.在图片缩放功能中,使用imagecreatetruecolor函数创建画布,并使用透明处理算法,但PNG格式的图片无法透明。用imagecreate函数创建画布可以解决这个问题,但是缩放出来的图片色数太少了 
* 
* 
*type值: 
* (1):代表使用图片缩放功能,此时,$value1代表缩放后图片的宽度,$value2代表缩放后图片的高度 
* (2):代表使用图片裁剪功能,此时,$value1代表裁剪开始点的坐标,例:从原点开始即是“0,0”前面是x轴后面是y轴,中间用,分隔,$value2代表裁剪的宽度和高度,同样也是“20,20”的形式使用 
* (3):代表使用加图片水印功能,此时,$value1代表水印图片的文件名,$value2代表水印在图片中的位置,有10值个可以选,1代表左上,2代表左中,3代表左右,4代表中左,5代表中中,6代表中右,7代表下做,8代表下中,9代表下右,0代表随机位置 
* 
*/ 
class image{ 
private $types; //使用的功能编号,1为图片缩放功能 2为图片裁剪功能 3,为图片加图片水印功能 
private $imgtype;//图片的格式 
private $image; //图片资源 
private $width;//图片宽度 
private $height;//图片高度 
private $value1;//根据所传type值的不同,$value1分别代表不同的值 
private $value2;//根据所传type值的不同,$value2分别代表不同的值 
private $endaddress;//输出后的地址+文件名 
function __construct($imageaddress, $types, $value1="", $value2="", $endaddress){ 
$this->types=$types; 
$this->image=$this->imagesources($imageaddress); 
$this->width=$this->imagesizex(); 
$this->height=$this->imagesizey(); 
$this->value1=$value1; 
$this->value2=$value2; 
$this->endaddress=$endaddress; 
} 
function outimage(){ //根据传入type值的不同,输出不同的功能 
switch($this->types){ 
case 1: 
$this->scaling(); 
break; 
case 2: 
$this->clipping(); 
break; 
case 3: 
$this->imagewater(); 
break; 
default: 
return false; 
} 
} 
private function imagewater(){ //加图片水印功能 
//用函数获取水印文件的长和宽 
$imagearrs=$this->getimagearr($this->value1); 
//调用函数计算出水印加载的位置 
$positionarr=$this->position($this->value2, $imagearrs[0], $imagearrs[1]); 
//加水印 
imagecopy($this->image, $this->imagesources($this->value1), $positionarr[0], $positionarr[1], 0, 0, $imagearrs[0], $imagearrs[1]); 
//调用输出方法保存 
$this->output($this->image); 
} 
private function clipping(){ //图片裁剪功能 
//将传进来的值分别赋给变量 
list($src_x, $src_y)=explode(",", $this->value1); 
list($dst_w, $dst_h)=explode(",", $this->value2); 
if($this->width < $src_x+$dst_w || $this->height < $src_y+$dst_h){ //这个判断就是限制不能截取到图片外面去 
return false; 
} 
//创建新的画布资源 
$newimg=imagecreatetruecolor($dst_w, $dst_h); 
//进行裁剪 
imagecopyresampled($newimg, $this->image, 0, 0, $src_x, $src_y, $dst_w, $dst_h, $dst_w, $dst_h); 
//调用输出方法保存 
$this->output($newimg); 
} 
private function scaling(){ //图片缩放功能 
//获取等比缩放的宽和高 
$this-> proimagesize(); 
//根据参数进行缩放,并调用输出函数保存处理后的文件 
$this->output($this->imagescaling()); 
} 
private function imagesources($imgad){ //获取图片类型并打开图像资源 
$imagearray=$this->getimagearr($imgad); 
switch($imagearray[2]){ 
case 1://gif 
$this->imgtype=1; 
$img=imagecreatefromgif($imgad); 
break; 
case 2://jpeg 
$this->imgtype=2; 
$img=imagecreatefromjpeg($imgad); 
break; 
case 3://png 
$this->imgtype=3; 
$img=imagecreatefrompng($imgad); 
break; 
default: 
return false; 
} 
return $img; 
} 
private function imagesizex(){ //获得图片宽度 
return imagesx($this->image); 
} 
private function imagesizey(){ //获取图片高度 
return imagesy($this->image); 
} 
private function proimagesize(){ //计算等比缩放的图片的宽和高 
if($this->value1 && ($this->width < $this->height)) { //等比缩放算法 
$this->value1=round(($this->value2/ $this->height)*$this->width); 
}else{ 
$this->value2=round(($this->value1/ $this->width) * $this->height); 
} 
} 
private function imagescaling(){//图像缩放功能,返回处理后的图像资源 
$newimg=imagecreatetruecolor($this->value1, $this->value2); 
$tran=imagecolortransparent($this->image);//处理透明算法 
if($tran >= 0 && $tran < imagecolorstotal($this->image)){ 
$tranarr=imagecolorsforindex($this->image, $tran); 
$newcolor=imagecolorallocate($newimg, $tranarr['red'], $tranarr['green'], $tranarr['blue']); 
imagefill($newimg, 0, 0, $newcolor); 
imagecolortransparent($newimg, $newcolor); 
} 
imagecopyresampled($newimg, $this->image, 0, 0, 0, 0, $this->value1, $this->value2, $this->width, $this->height); 
return $newimg; 
} 
private function output($image){//输出图像 
switch($this->imgtype){ 
case 1: 
imagegif($image, $this->endaddress); 
break; 
case 2: 
imagejpeg($image, $this->endaddress); 
break; 
case 3: 
imagepng($image, $this->endaddress); 
break; 
default: 
return false; 
} 
} 
private function getimagearr($imagesou){//返回图像属性数组方法 
return getimagesize($imagesou); 
} 
private function position($num, $width, $height){//根据传入的数字返回一个位置的坐标,$width和$height分别代表插入图像的宽和高 
switch($num){ 
case 1: 
$positionarr[0]=0; 
$positionarr[1]=0; 
break; 
case 2: 
$positionarr[0]=($this->width-$width)/2; 
$positionarr[1]=0; 
break; 
case 3: 
$positionarr[0]=$this->width-$width; 
$positionarr[1]=0; 
break; 
case 4: 
$positionarr[0]=0; 
$positionarr[1]=($this->height-$height)/2; 
break; 
case 5: 
$positionarr[0]=($this->width-$width)/2; 
$positionarr[1]=($this->height-$height)/2; 
break; 
case 6: 
$positionarr[0]=$this->width-$width; 
$positionarr[1]=($this->height-$height)/2; 
break; 
case 7: 
$positionarr[0]=0; 
$positionarr[1]=$this->height-$height; 
break; 
case 8: 
$positionarr[0]=($this->width-$width)/2; 
$positionarr[1]=$this->height-$height; 
break; 
case 9: 
$positionarr[0]=$this->width-$width; 
$positionarr[1]=$this->height-$height; 
break; 
case 0: 
$positionarr[0]=rand(0, $this->width-$width); 
$positionarr[1]=rand(0, $this->height-$height); 
break; 
} 
return $positionarr; 
} 
function __destruct(){ 
imagedestroy($this->image); 
} 
} 
?>
PHP 相关文章推荐
在PHP中使用灵巧的体系结构
Oct 09 PHP
php 常用类整理
Dec 23 PHP
php 对输入信息的进行安全过滤的函数代码
Jun 29 PHP
php仿QQ验证码的实例分析
Jul 01 PHP
详解php中反射的应用
Mar 15 PHP
PHP模板引擎Smarty自定义变量调解器用法
Apr 11 PHP
PHP实现的线索二叉树及二叉树遍历方法详解
Apr 25 PHP
PHP+JQuery+Ajax实现分页方法详解
Aug 06 PHP
Yii遍历行下每列数据的方法
Oct 17 PHP
PHP获取当前日期及本周一是几月几号的方法
Mar 28 PHP
PHP+Redis开发的书签案例实战详解
Jul 09 PHP
Laravel自定义 封装便捷返回Json数据格式的引用方法
Sep 29 PHP
调试一段PHP程序时遇到的三个问题
Jan 17 #PHP
php中可能用来加密字符串的函数[base64_encode、urlencode、sha1]
Jan 16 #PHP
PHP CURL模拟登录新浪微博抓取页面内容 基于EaglePHP框架开发
Jan 16 #PHP
php 阴历-农历-转换类代码
Jan 16 #PHP
yii框架中的Url生产问题小结
Jan 16 #PHP
fgetcvs在linux的问题
Jan 15 #PHP
PHP异步调用socket实现代码
Jan 12 #PHP
You might like
模仿OSO的论坛(一)
2006/10/09 PHP
PHP 全角转半角实现代码
2010/05/16 PHP
yii实现使用CUploadedFile上传文件的方法
2015/12/28 PHP
Laravel使用Caching缓存数据减轻数据库查询压力的方法
2016/03/15 PHP
用Javascript读取中文COOKIE的解决办法
2007/02/15 Javascript
xml和web特殊字符
2009/04/28 Javascript
Jquery获取复选框被选中值的简单方法
2013/07/04 Javascript
jquery通过a标签删除table中的一行的代码
2013/12/02 Javascript
js实现弹出窗口、页面变成灰色并不可操作的例子分享
2014/05/10 Javascript
Node.js中使用Buffer编码、解码二进制数据详解
2014/08/16 Javascript
微信小程序 生命周期详解
2016/10/12 Javascript
JavaScript实现HTML5游戏断线自动重连的方法
2017/09/18 Javascript
Vue+Flask实现简单的登录验证跳转的示例代码
2018/01/13 Javascript
vue动画打包后失效问题的解决方法
2018/09/18 Javascript
关于JS模块化的知识点分享
2019/10/16 Javascript
[56:41]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 Newbee vs OG
2018/04/01 DOTA
Python实现全角半角转换的方法
2014/08/18 Python
python实现聊天小程序
2018/03/13 Python
python实现时间o(1)的最小栈的实例代码
2018/07/23 Python
Django ORM多对多查询方法(自定义第三张表&amp;ManyToManyField)
2019/08/09 Python
python 爬取B站原视频的实例代码
2020/09/09 Python
Python爬虫之Selenium中frame/iframe表单嵌套页面
2020/12/04 Python
如何查看python关键字
2021/01/17 Python
如何在Canvas上的图形/图像绑定事件监听的实现
2020/09/16 HTML / CSS
波兰多品牌运动商店:StreetStyle24.pl
2020/09/22 全球购物
C#怎么让一个窗口居中显示?
2015/10/20 面试题
模具专业推荐信
2013/10/30 职场文书
医学检验专业大学生求职信
2013/11/18 职场文书
入党积极分子自我鉴定
2014/02/18 职场文书
公司管理建议书范文
2014/03/12 职场文书
合同协议书格式
2014/04/18 职场文书
企业整改报告范文
2014/11/08 职场文书
《夸父追日》教学反思
2016/02/20 职场文书
python 实现定时任务的四种方式
2021/04/01 Python
详解Java七大阻塞队列之SynchronousQueue
2021/09/04 Java/Android
Python用tkinter实现自定义记事本的方法详解
2022/03/31 Python