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 相关文章推荐
PHP4 与 MySQL 数据库操作函数详解
Oct 09 PHP
php中的登陆login
Jan 18 PHP
php empty()与isset()区别的详细介绍
Jun 17 PHP
PHP获取时间排除周六、周日的两个方法
Jun 30 PHP
Yii使用CLinkPager分页实例详解
Jul 23 PHP
Linux下从零开始安装配置Nginx服务器+PHP开发环境
Dec 21 PHP
PHP基于单例模式实现的数据库操作基类
Jan 15 PHP
PHP中SERIALIZE和JSON的序列化与反序列化操作区别分析
Oct 11 PHP
thinkPHP实现多字段模糊匹配查询的方法
Dec 01 PHP
Linux下安装Memcached服务器和客户端与PHP使用示例
Apr 15 PHP
PHP面向对象程序设计之对象的遍历操作示例
Jun 12 PHP
Laravel ORM 数据model操作教程
Oct 21 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
使用数据库保存session的方法
2006/10/09 PHP
ASP和PHP都是可以删除自身的
2007/04/09 PHP
php下关于Cannot use a scalar value as an array的解决办法
2010/08/08 PHP
php阿拉伯数字转中文人民币大写
2015/12/21 PHP
PHP数组相加操作及与array_merge的区别浅析
2016/11/26 PHP
php如何计算两坐标点之间的距离
2018/12/29 PHP
YUI 读码日记之 YAHOO.lang.is*
2008/03/22 Javascript
jquery获取下拉列表的值为null的解决方法
2011/03/18 Javascript
JavaScript中数组对象的那些自带方法介绍
2013/03/12 Javascript
Jquery中LigerUi的弹出编辑框(实现方法)
2013/07/09 Javascript
Jqgrid表格随窗口大小改变而改变的简单实例
2013/12/28 Javascript
Flash图片上传组件 swfupload使用指南
2015/03/14 Javascript
浅析JavaScript中的变量复制、参数传递和作用域链
2016/01/13 Javascript
总结javascript中的六种迭代器
2016/08/16 Javascript
父组件中vuex方法更新state子组件不能及时更新并渲染的完美解决方法
2018/04/25 Javascript
element ui table(表格)实现点击一行展开功能
2018/12/04 Javascript
微信小程序中如何使用flyio封装网络请求
2019/07/03 Javascript
layer.open 子页面弹出层向父页面传输数据的例子
2019/09/26 Javascript
在Django中同时使用多个配置文件的方法
2015/07/22 Python
致Python初学者 Anaconda入门使用指南完整版
2018/04/05 Python
python数据处理之如何选取csv文件中某几行的数据
2019/09/02 Python
将自己的数据集制作成TFRecord格式教程
2020/02/17 Python
Python基于requests库爬取网站信息
2020/03/02 Python
印度网上购物首选目的地:Flipkart
2016/08/01 全球购物
Woolworth官网:澳洲第一大超市
2017/06/25 全球购物
印度在线内衣和时尚目的地:Zivame
2017/09/28 全球购物
一个C/C++编程面试题
2013/11/10 面试题
教育局长自荐信范文
2013/12/22 职场文书
高二历史教学反思
2014/01/25 职场文书
英语分层教学实施方案
2014/06/15 职场文书
放飞梦想演讲稿200字
2014/08/26 职场文书
群众路线对照检查剖析材料
2014/10/09 职场文书
社区务虚会发言材料
2014/10/20 职场文书
应届毕业生自荐信
2015/03/04 职场文书
2016年八一建军节活动总结
2016/04/05 职场文书
使用python如何删除同一文件夹下相似的图片
2021/05/07 Python