php GD库裁剪、加水印图片处理
2014-01-17 22:04
501 查看
<?php // 原始图片 $img1 = 'www.jpg'; // 水印后的图片 $img2 = 'bbbb.jpg'; // 水印 $water = 'nnn.jpg'; $img = new image (); // 等比缩放 $res = $img->param ( $img1 )->thumb ( $img1, 40, 40, 0 ); // center center 裁剪 /* $img->param ( $img1 )->thumb ( './image/test_1.jpg', 200, 200, 1 ); // top left 裁剪 $img->param ( $img1 )->thumb ( './image/test_2.jpg', 200, 200, 2 ); // 右下角添加水印 $img->param ( $img1 )->water ( $img2, $water, 9 ); */ class image { // 当前图片 protected $img; // 图像types 对应表 protected $types = array ( 1 => 'gif', 2 => 'jpg', 3 => 'png', 6 => 'bmp' ); public function __construct($img = '') { ! $img && $this->param ( $img ); } public function param($img) { $this->img = $img; return $this; } public function getImageInfo($img) { $info = @getimagesize ( $img ); if (isset ( $this->types [$info [2]] )) { $info ['ext'] = $info ['type'] = $this->types [$info [2]]; } else { $info ['ext'] = $info ['type'] = 'jpg'; } $info ['type'] == 'jpg' && $info ['type'] = 'jpeg'; $info ['size'] = @filesize ( $img ); return $info; } // thumb(新图地址, 宽, 高, 裁剪, 允许放大) public function thumb($filename, $new_w = 160, $new_h = 120, $cut = 0, $big = 0) { // 获取原图信息 $info = $this->getImageInfo ( $this->img ); if (! empty ( $info [0] )) { $old_w = $info [0]; $old_h = $info [1]; $type = $info ['type']; $ext = $info ['ext']; unset ( $info ); // 如果原图比缩略图小 并且不允许放大 if ($old_w < $new_h && $old_h < $new_w && ! $big) { return false; } // 裁剪图片 if ($cut == 0) { // 等比列 $scale = min ( $new_w / $old_w, $new_h / $old_h ); // 计算缩放比例 $width = ( int ) ($old_w * $scale); // 缩略图尺寸 $height = ( int ) ($old_h * $scale); $start_w = $start_h = 0; $end_w = $old_w; $end_h = $old_h; } elseif ($cut == 1) { // center center 裁剪 $scale1 = round ( $new_w / $new_h, 2 ); $scale2 = round ( $old_w / $old_h, 2 ); if ($scale1 > $scale2) { $end_h = round ( $old_w / $scale1, 2 ); $start_h = ($old_h - $end_h) / 2; $start_w = 0; $end_w = $old_w; } else { $end_w = round ( $old_h * $scale1, 2 ); $start_w = ($old_w - $end_w) / 2; $start_h = 0; $end_h = $old_h; } $width = $new_w; $height = $new_h; } elseif ($cut == 2) { // left top 裁剪 $scale1 = round ( $new_w / $new_h, 2 ); $scale2 = round ( $old_w / $old_h, 2 ); if ($scale1 > $scale2) { $end_h = round ( $old_w / $scale1, 2 ); $end_w = $old_w; } else { $end_w = round ( $old_h * $scale1, 2 ); $end_h = $old_h; } $start_w = 0; $start_h = 0; $width = $new_w; $height = $new_h; } // 载入原图 $createFun = 'ImageCreateFrom' . $type; $oldimg = $createFun ( $this->img ); // 创建缩略图 if ($type != 'gif' && function_exists ( 'imagecreatetruecolor' )) { $newimg = imagecreatetruecolor ( $width, $height ); } else { $newimg = imagecreate ( $width, $height ); } // 复制图片 if (function_exists ( "ImageCopyResampled" )) { ImageCopyResampled ( $newimg, $oldimg, 0, 0, $start_w, $start_h, $width, $height, $end_w, $end_h ); } else { ImageCopyResized ( $newimg, $oldimg, 0, 0, $start_w, $start_h, $width, $height, $end_w, $end_h ); } // 对jpeg图形设置隔行扫描 $type == 'jpeg' && imageinterlace ( $newimg, 1 ); // 生成图片 $imageFun = 'image' . $type; echo $imageFun; ! @$imageFun ( $newimg, $filename ) && die ( '保存失败!检查目录是否存在并且可写?' ); ImageDestroy ( $newimg ); ImageDestroy ( $oldimg ); return $filename; } return false; } // water(保存地址,水印图片,水印位置,透明度) public function water($filename, $water, $pos = 0, $pct = 80) { // 加载水印图片 $info = $this->getImageInfo ( $water ); if (! empty ( $info [0] )) { $water_w = $info [0]; $water_h = $info [1]; $type = $info ['type']; $fun = 'imagecreatefrom' . $type; $waterimg = $fun ( $water ); } else { return false; } // 加载背景图片 $info = $this->getImageInfo ( $this->img ); if (! empty ( $info [0] )) { $old_w = $info [0]; $old_h = $info [1]; $type = $info ['type']; $fun = 'imagecreatefrom' . $type; $oldimg = $fun ( $this->img ); } else { return false; } // 剪切水印 $water_w > $old_w && $water_w = $old_w; $water_h > $old_h && $water_h = $old_h; // 水印位置 switch ($pos) { case 0 : // 随机 $posX = rand ( 0, ($old_w - $water_w) ); $posY = rand ( 0, ($old_h - $water_h) ); break; case 1 : // 1为顶端居左 $posX = 0; $posY = 0; break; case 2 : // 2为顶端居中 $posX = ($old_w - $water_w) / 2; $posY = 0; break; case 3 : // 3为顶端居右 $posX = $old_w - $water_w; $posY = 0; break; case 4 : // 4为中部居左 $posX = 0; $posY = ($old_h - $water_h) / 2; break; case 5 : // 5为中部居中 $posX = ($old_w - $water_w) / 2; $posY = ($old_h - $water_h) / 2; break; case 6 : // 6为中部居右 $posX = $old_w - $water_w; $posY = ($old_h - $water_h) / 2; break; case 7 : // 7为底端居左 $posX = 0; $posY = $old_h - $water_h; break; case 8 : // 8为底端居中 $posX = ($old_w - $water_w) / 2; $posY = $old_h - $water_h; break; case 9 : // 9为底端居右 $posX = $old_w - $water_w; $posY = $old_h - $water_h; break; default : // 随机 $posX = rand ( 0, ($old_w - $water_w) ); $posY = rand ( 0, ($old_h - $water_h) ); break; } // 设定图像的混色模式 imagealphablending ( $oldimg, true ); // 添加水印 imagecopymerge ( $oldimg, $waterimg, $posX, $posY, 0, 0, $water_w, $water_h, $pct ); $fun = 'image' . $type; ! @$fun ( $oldimg, $filename ) && die ( '保存失败!检查目录是否存在并且可写?' ); imagedestroy ( $oldimg ); imagedestroy ( $waterimg ); return $filename; } } ?>
相关文章推荐
- PHP中AJAX的使用(完整实例【大牛可飘过】)
- 整理 mac 安装php扩展mcrypt
- PHP算法和基本处理方法
- yii的单元测试
- Composer PHP的包依赖管理工具
- XamPP 安装/升级PHPUnit
- 打开FTP服务器上的文件夹时发生错误,请检查是否有权限访问该文件夹
- php preg_replace函数常用例子详解
- ftp
- 一步一步分析解决PHP文件下载直接在网页中打开问题
- Xtreme ToolkitPro的使用
- Thinkphp CURD中的where方法
- web服务器,cgi及php-fpm之间关系
- php编程 - php简单算法 - 肇事车辆问题
- PHP上台阶问题(斐波纳契数列应用)
- php 截取字符串第一个字符,截取掉字符串最后一个字符的方法
- php进制之间相互转换
- WAMP环境下 的 Zend Framework 配置
- 使用PHP强制下载PDF文件示例
- 5种PHP创建数组的实例代码分享