PHP 处理图片的类实现代码


Posted in PHP onOctober 23, 2009
<?php 
/** 
* author:yagas 
* email:yagas60@21cn.com 
*/ 
class Image 
{ 
/** 类保护变量 */ 
protected $th_width = 100; 
protected $th_height = 50; 
protected $quality = 85; //图片质量 
protected $transparent = 50; //水印透明度 
protected $background = "255,255,255"; //背景颜色 
/** 
* 生成缩略图文件 
* @param $src 原图文件 
* @param $dst 目标文件 
*/ 
public function thumb($src, $dst=null, $output=true) 
{ 
$thumb = array($this->th_width, $this->th_height); 
$this->scale($src, $thumb, $dst, $output); 
} 
/** 
* 对图片按百分比进行缩放处理 
* @param string $src 原图文件 
* @param string $dst 输入的目标文件 
* @param float/array $zoom 缩放比例,浮点类型时按百分比绽放,数组类型时按指定大小时行缩放 
* @param boolean $output 是否生成文件输出 
*/ 
public function scale($src, $dst=null, $zoom=1, $output=true) 
{ 
if(!file_exists($src)) die('File not exists.'); 
if(!$zoom) die('the zoom undefine.'); 
$src_im = $this->IM($src); 
$old_width = imagesx($src_im); 
if(is_float($zoom)) { 
//按百分比进行缩放 
$new_width = $old_width * $zoom; 
} 
elseif(is_array($zoom)) { 
//明确的缩放尺寸 
$new_width = $zoom[0]; 
} 
//是否定义的缩放的高度 
if(!isset($zoom[1])) { 
//等比例缩放 
$resize_im = $this->imageresize($src_im, $new_width); 
} 
else { 
//非等比例缩放 
$resize_im = $this->imageresize($src_im, $new_width, $zoom[1]); 
} 
if(!$output) { 
header("Content-type: image/jpeg"); 
imagejpeg($resize_im, null, $this->quality); 
} 
else { 
$new_file = empty($dst)? $src:$dst; 
imagejpeg($resize_im, $new_file, $this->quality); 
} 
imagedestroy($im); 
imagedestroy($nIm); 
} 
/** 
* 对图片进行裁切 
* @param $src 原始文件 
* @param $dst 目标文件 
* @param $output 是否生成目标文件 
*/ 
public function capture($src, $dst=null, $output=true) { 
if(!file_exists($src)) die('File not exists.'); 
$width = $this->th_width; 
$height = $this->th_height; 
$src_im = $this->IM($src); 
$old_width = imagesx($src_im); 
$old_height = imagesy($src_im); 
$capture = imagecreatetruecolor($width, $height); 
$rgb = explode(",", $this->background); 
$white = imagecolorallocate($capture, $rgb[0], $rgb[1], $rgb[2]); 
imagefill($capture, 0, 0, $white); 
//当图片大于缩略图时进行缩放 
if($old_width > $width && $old_height>$height) { 
$resize_im = $this->imageresize($src_im, $width); 
//图片比例不合规范时,重新计算比例进行裁切 
if(imagesy($resize_im) < $height) { 
$proportion = $old_height/$this->th_height; 
$resize_im = $this->imageresize($src_im, $old_width/$proportion); 
} 
$posx = 0; 
$posy = 0; 
} 
else { 
//图片小于缩略图时将图片居中显示 
$posx = ($width-$old_width)/2; 
$posy = ($height-$old_height)/2; 
$resize_im = $src_im; 
} 
imagecopy($capture, $resize_im, $posx, $posy, 0, 0, imagesx($resize_im), imagesy($resize_im)); 
if(!$output) { 
header("Content-type: image/jpeg"); 
imagejpeg($capture, null, $this->quality); 
} 
else { 
$new_file = empty($dst)? $src:$dst; 
imagejpeg($capture, $new_file, $this->quality); 
} 
imagedestroy($src_im); 
@imagedestroy($resize_im); 
imagedestroy($capture); 
} 
/** 
* 写入水印图片 
* @param $src 需要写入水印的图片 
* @param $mark 水印图片 
* @param $transparent 水印透明度 
*/ 
public function mark($src, $mark, $dst='', $output=true) 
{ 
$mark_info = getimagesize($mark); 
$src_info = getimagesize($src); 
list($mw,$mh) = $mark_info; 
list($sw,$sh) = $src_info; 
$px = $sw - $mw; 
$py = $sh - $mh; 
$im = $this->IM($src); 
$mim = $this->IM($mark); 
imagecopymerge($im, $mim, $px, $py, 0, 0, $mw, $mh, $this->transparent); 
if($output){ 
$new_file = empty($dst)? $src:$dst; 
imagejpeg($im, $new_file, $this->quality); 
} 
else 
{ 
header('Content-type: image/jpeg'); 
imagejpeg($im); 
} 
imagedestroy($im); 
imagedestroy($mim); 
} 
/** 
* 通过文件,获取不同的GD对象 
*/ 
protected function IM($file) 
{ 
if(!file_exists($file)) die('File not exists.'); 
$info = getimagesize($file); 
switch($info['mime']) 
{ 
case 'image/gif': 
$mim = imagecreatefromgif($file); 
break; 
case 'image/png': 
$mim = imagecreatefrompng($file); 
imagealphablending($mim, false); 
imagesavealpha($mim, true); 
break; 
case 'image/jpeg': 
$mim = imagecreatefromjpeg($file); 
break; 
default: 
die('File format errors.'); 
} 
return $mim; 
} 
/** 
* 对图片进行缩放的处理 
* @param resource $src_im 图像GD对象 
* @param integer $width 图片的宽度 
* @param integer $height 图片的高度,如果不设置高度,将对图片进行等比例缩放 
* @return resuorce $im 返回一个GD对象 
*/ 
protected function imageresize($src_im, $width, $height=null) { 
$old_width = imagesx($src_im); 
$old_height = imagesy($src_im); 
$proportion = $old_width/$old_height; 
$new_width = $width; 
$new_height = is_null($height)? round($new_width / $proportion):$height; 
//创建新的图象并填充默认的背景色 
$im = imagecreatetruecolor($new_width, $new_height); 
$rgb = explode(",", $this->background); 
$white = imagecolorallocate($im, $rgb[0], $rgb[1], $rgb[2]); 
imagefill($im, 0, 0, $white); 
//对图片进行缩放 
imagecopyresized($im, $src_im, 0, 0, 0, 0, $new_width, $new_height, $old_width, $old_height); 
return $im; 
} 
/** 
* 类变量赋值 
*/ 
public function __set($key, $value) 
{ 
$this->$key = $value; 
} 
/** 
* 获取类变量值 
*/ 
public function __get($key) 
{ 
return $this->$key; 
} 
} 
?>
PHP 相关文章推荐
PHP生成静态页
Nov 25 PHP
php array_push()数组函数:将一个或多个单元压入数组的末尾(入栈)
Jul 12 PHP
新手学习PHP的一些基础知识分享
Jul 27 PHP
分享PHP header函数使用教程
Sep 05 PHP
php jquery 多文件上传简单实例
Dec 23 PHP
PHP登陆后跳转到登陆前页面实现思路及代码
Jan 17 PHP
PHP加Nginx实现动态裁剪图片方案
Mar 10 PHP
php的sso单点登录实现方法
Jan 08 PHP
php实现session自定义会话处理器的方法
Jan 27 PHP
PHP实现自动识别原编码并对字符串进行编码转换的方法
Jul 13 PHP
php实现的三个常用加密解密功能函数示例
Nov 06 PHP
PHP Trait代码复用类与多继承实现方法详解
Jun 17 PHP
PHP教程 变量定义
Oct 23 #PHP
PHP教程 基本语法
Oct 23 #PHP
php self,$this,const,static,-&amp;gt;的使用
Oct 22 #PHP
PHP 长文章分页函数 带使用方法,不会分割段落,翻页在底部
Oct 22 #PHP
Wordpress php 分页代码
Oct 21 #PHP
PHP字符串 ==比较运算符的副作用
Oct 21 #PHP
php 3行代码的分页算法(求起始页和结束页)
Oct 21 #PHP
You might like
最令PHP初学者头痛的十四个问题
2006/07/12 PHP
php排序算法(冒泡排序,快速排序)
2012/10/09 PHP
php格式化金额函数分享
2015/02/02 PHP
php实现Session存储到Redis
2015/11/11 PHP
Symfony核心类概述
2016/03/17 PHP
js 事件小结 表格区别
2007/08/13 Javascript
解决jquery .ajax 在IE下卡死问题的解决方法
2009/10/26 Javascript
用apply让javascript函数仅执行一次的代码
2010/06/27 Javascript
jquery下利用jsonp跨域访问实现方法
2010/07/29 Javascript
window.ActiveXObject使用说明
2010/11/08 Javascript
Jquery css函数用法(判断标签是否拥有某属性)
2011/05/28 Javascript
Javascript脚本实现静态网页加密实例代码
2013/11/05 Javascript
举例讲解AngularJS中的模块
2015/06/17 Javascript
IE10中flexigrid无法显示数据的解决方法
2015/07/26 Javascript
JQuery validate插件验证用户注册信息
2016/05/11 Javascript
浅谈js中StringBuffer类的实现方法及使用
2016/09/02 Javascript
jQuery UI Grid 模态框中的表格实例代码
2017/04/01 jQuery
node.js 利用流实现读写同步,边读边写的方法
2017/09/11 Javascript
基于对象合并功能的实现示例
2017/10/10 Javascript
js中el表达式的使用和非空判断方法
2018/03/28 Javascript
Node.js EventEmmitter事件监听器用法实例分析
2019/01/07 Javascript
js数据类型转换与流程控制操作实例分析
2019/12/18 Javascript
python之virtualenv的简单使用方法(必看篇)
2017/11/25 Python
Python中使用logging和traceback模块记录日志和跟踪异常
2019/04/09 Python
Python supervisor强大的进程管理工具的使用
2019/04/24 Python
pygame实现俄罗斯方块游戏(对战篇1)
2019/10/29 Python
python将图片转base64,实现前端显示
2020/01/09 Python
使用keras实现densenet和Xception的模型融合
2020/05/23 Python
CSS3 实现倒计时效果
2020/11/25 HTML / CSS
世界上最值得信赖的多日游在线市场:TourRadar
2018/07/20 全球购物
法国最大的在线眼镜店:EasyLunettes
2019/08/26 全球购物
绝对经典成功的大学生推荐信
2013/11/08 职场文书
拾金不昧感谢信范文
2015/01/21 职场文书
道士塔读书笔记
2015/06/30 职场文书
公务员的复习计划书,请收下!
2019/07/15 职场文书
mysql知识点整理
2021/04/05 MySQL