php 图片操作类,支持生成缩略图,添加水印,上传缩略图
<?php
class Image { //类开始 public $originimage = ""; //源图片文件地址 public $imageext = ""; //源图片格式 public $thumbimage = ""; //缩略图文件存放地址 public $thumb_maxwidth = 1440; //缩略图最大宽度 public $thumb_maxheight = 900; //缩略图最大高度 public $watermark_text = ""; //水印文字内容 public $watermark_minwidth = 300; //源图片最小宽度:大于此值时加水印 public $watermark_minheight = 200; //源图片最小高度:大于此值时加水印 public $watermark_fontfile = ""; //字体文件 public $watermark_fontsize = 14; //字体大小 public $watermark_logo = "config/water.png"; //水印LOGO地址 public $watermark_transparent = 20; //水印LOGO不透明度 private $origin_width = 0; //源图片宽度 private $origin_height = 0; //源图片高度 private $imageQuilty = 90; //图片质量 private $tmp_originimage = ""; //临时图片(源图片) private $tmp_thumbimage = ""; //临时图片(缩略图) private $tmp_waterimage = ""; //临时图片(水印LOGO) private $_waterPosition = 2; //1正中间 2右下角 //生成缩略图 public function gen_thumbimage() { if ($this->originimage == "" || $this->thumbimage == "") { return 0; } $this->get_oriwidthheight (); if ($this->origin_width < $this->thumb_maxwidth && $this->origin_height < $this->thumb_maxheight) { $this->thumb_maxwidth = $this->origin_width; $this->thumb_maxheight = $this->origin_height; } else { if ($this->origin_width < $this->origin_height) { $this->thumb_maxwidth = ($this->thumb_maxheight / $this->origin_height) * $this->origin_width; } else { $this->thumb_maxheight = ($this->thumb_maxwidth / $this->origin_width) * $this->origin_height; } } $this->get_imagetype (); $this->gen_tmpimage_origin (); $this->gen_tmpimage_thumb (); if ($this->tmp_originimage == "" || $this->tmp_thumbimage == "") { return - 1; } imagecopyresampled ( $this->tmp_thumbimage, $this->tmp_originimage, 0, 0, 0, 0, $this->thumb_maxwidth,$this->thumb_maxheight, $this->origin_width, $this->origin_height ); switch ($this->imageext) { case "gif" : imagegif ( $this->tmp_thumbimage, $this->thumbimage ); return 1; break; case "jpg" : imagejpeg ( $this->tmp_thumbimage, $this->thumbimage, $this->imageQuilty ); return 2; break; case "png" : imagepng ( $this->tmp_thumbimage, $this->thumbimage ); return 3; break; default : return - 2; break; } } //添加文字水印 public function add_watermark1() { if ($this->originimage == "" || $this->watermark_text == "" || $this->watermark_fontfile == "") { return 0; } $this->get_oriwidthheight (); if ($this->origin_width < $this->watermark_minwidth || $this->origin_height < $this->watermark_minheight) { return 0; } $this->get_imagetype (); $this->gen_tmpimage_origin (); if ($this->tmp_originimage == "") { return - 1; } $textcolor = imagecolorallocate ( $this->tmp_originimage, 255, 0, 0 ); $angle = 0; $px = $this->origin_width / 2 - 200; $py = $this->origin_height / 2 - 10; imagettftext ( $this->tmp_originimage, $this->watermark_fontsize, $angle, $px, $py, $textcolor, $this->watermark_fontfile, $this->watermark_text ); switch ($this->imageext) { case "gif" : imagegif ( $this->tmp_originimage, $this->originimage ); return 1; break; case "jpg" : imagejpeg ( $this->tmp_originimage, $this->originimage, $this->imageQuilty ); return 2; break; case "png" : imagepng ( $this->tmp_originimage, $this->originimage ); return 3; break; default : return - 2; break; } } //添加LOGO水印 public function add_watermark2() { if ($this->originimage == "" || $this->watermark_logo == "") { return 0; } $this->get_oriwidthheight (); if ($this->origin_width < $this->watermark_minwidth || $this->origin_height < $this->watermark_minheight) { return 0; } $this->get_imagetype (); $this->gen_tmpimage_origin (); $this->gen_tmpimage_waterlogo (); if ($this->tmp_originimage == "" || $this->tmp_waterimage == "") { return - 1; } list ( $logo_width, $logo_height ) = getimagesize ( $this->watermark_logo ); //正中间 $waterZb = $this->waterPosition ( $logo_width, $logo_height ); $px = $waterZb ['x']; $py = $waterZb ['y']; imagecopymerge ( $this->tmp_originimage, $this->tmp_waterimage, $px, $py, 0, 0, $logo_width,$logo_height, $this->watermark_transparent ); switch ($this->imageext) { case "gif" : imagegif ( $this->tmp_originimage, $this->originimage ); return 1; break; case "jpg" : imagejpeg ( $this->tmp_originimage, $this->originimage, $this->imageQuilty ); return 2; break; case "png" : imagepng ( $this->tmp_originimage, $this->originimage ); return 3; break; default : return - 2; break; } } /** * 上传缩略图 * 注意上传文件大小限制 *@param String $files $_FILES['upload'] 类型 *@param String $path 存储的目录 默认在/static/attached/ *@param boolean $isWater 是否添加水印 * @return string $filePath 网页url图片路径 */ public function upload($files, $path, $isWater) { if (is_uploaded_file ( $files ['tmp_name'] )) { $upfile = $files; $name = $upfile [name]; $type = $upfile [type]; $size = $upfile [size]; $tmp_name = $upfile [tmp_name]; $error = $upfile [error]; if ($size > 1048576) { return array ('status' => false, 'message' => "$name图片太大超过1MB" ); } $rs = $this->getImageSize ( $tmp_name ); if (! $rs ['status']) { $rs ['message'] = $name . $rs ['message']; return $rs; } // 创建文件夹 $save_path = getcwd () . "/static/attached/" . $path . "/"; $save_url = "./static/attached/" . $path . "/"; $ym = date ( "Ym" ); $save_path .= $ym . "/"; $save_url .= $ym . "/"; if (! file_exists ( $save_path )) { mkdir ( $save_path ); } if ($error == '0') { $fileType = substr ( $name, strpos ( $name, "." ) + 1 ); $prefix = $this->getRandPrefix (); $newName = date ( "YmdHi" ) . $prefix . "." . $fileType; $filepath = $save_path . $newName; move_uploaded_file ( $tmp_name, $filepath ); } if ($isWater) { $this->water ( $filepath ); } return array ('status' => true, 'message' => $save_url . $newName ); } } /** * 图片增加水印处理 * @param unknown_type $image */ public function water($image) { $this->watermark_logo = ROOT . $this->watermark_logo; $this->originimage = $image; //LOGO水印 $this->add_watermark2 (); } /** * * 获取随机前缀 */ private function getRandPrefix() { $string = "abcdefghijklmnopqrstuvwxyz0123456789"; $prefix = ''; for($i = 0; $i < 4; $i ++) { $rand = rand ( 0, 33 ); $prefix .= $string {$rand}; } return $prefix; } //检测图片大小 private function getImageSize($image) { list ( $width, $height, $type, $attr ) = getimagesize ( $image ); if ($type != 2 && $type != 3) { return array ('status' => false, 'message' => "图片格式不正确,请上传JPG或者PNG图片" . $type ); } //检测图片大小 if ($width > 1440) { return array ('status' => false, 'message' => "图片宽度请小于1440px,当前为" . $width . "px" ); } if ($height > 900) { return array ('status' => false, 'message' => "图片高度请小于900px,当前为" . $height . "px" ); } return array ('status' => true ); } /** * 生成缩略图 * * @param String $imagefile 原始文件 * @param String $thumbWidth 缩略图宽度 * @param String $thumbHeight 缩略图高度 * @return String 缩略图url */ public function reduceImage($imagefile, $thumbWidth, $thumbHeight, $path = "thumb") { // 生成缩略图 $dir = date ( "Ym", time () ); $imagefile = ROOT . $imagefile; $imagefile_s = ROOT . "static/attached/" . $path . "/" . $dir . "/s_" . basename ( $imagefile ); $imagetrans = new Image (); $imagetrans->originimage = $imagefile; $imagetrans->thumbimage = $imagefile_s; $imagetrans->thumb_maxwidth = $thumbWidth; $imagetrans->thumb_maxheight = $thumbHeight; $isokid = $imagetrans->gen_thumbimage (); return "./static/attached/" . $path . "/" . $dir . "/s_" . basename ( $imagefile ); } /** * 水印位置 * @param int $logo_width * @param int $logo_height * @return 水印坐标 */ private function waterPosition($logo_width, $logo_height) { switch ($this->_waterPosition) { case 1 : $px = $this->origin_width / 2 - $logo_width / 2; $py = $this->origin_height / 2 - $logo_height / 2; break; case 2 : $px = $this->origin_width - $logo_width - 10; $py = $this->origin_height - $logo_height - 10; break; default : $px = $this->origin_width / 2 - $logo_width / 2; $py = $this->origin_height / 2 - $logo_height / 2; break; } return array ('x' => $px, 'y' => $py ); } //获取图片尺寸 private function get_oriwidthheight() { list ( $this->origin_width, $this->origin_height ) = getimagesize ( $this->originimage ); return 1; } /* * 检测图片格式 * 原方法需要开启exif 扩展 */ private function get_imagetype() { $ext = $this->getImgext ( $this->originimage ); switch ($ext) { case 1 : $this->imageext = "gif"; break; case 2 : $this->imageext = "jpg"; break; case 3 : $this->imageext = "png"; break; default : $this->imageext = "unknown"; break; } } //创建临时图片(源图片) private function gen_tmpimage_origin() { $ext = $this->getImgext ( $this->originimage ); switch ($ext) { case 1 : $this->tmp_originimage = imagecreatefromgif ( $this->originimage ); $bgcolor = imagecolorallocate ( $this->tmp_originimage, 0, 0, 0 ); $bgcolortrans = imagecolortransparent ( $this->tmp_originimage, $bgcolor ); break; case 2 : $this->tmp_originimage = imagecreatefromjpeg ( $this->originimage ); break; case 3 : $this->tmp_originimage = imagecreatefrompng ( $this->originimage ); imagesavealpha ( $this->tmp_originimage, true ); break; default : $this->tmp_originimage = ""; break; } } //创建临时图片(缩略图) private function gen_tmpimage_thumb() { $ext = $this->getImgext ( $this->originimage ); switch ($ext) { case 1 : $this->tmp_thumbimage = imagecreatetruecolor ( $this->thumb_maxwidth, $this->thumb_maxheight ); $bgcolor = imagecolorallocate ( $this->tmp_thumbimage, 255, 255, 255 ); imagefill ( $this->tmp_thumbimage, 0, 0, $bgcolor ); break; case 2 : $this->tmp_thumbimage = imagecreatetruecolor ( $this->thumb_maxwidth, $this->thumb_maxheight ); break; case 3 : $this->tmp_thumbimage = imagecreatetruecolor ( $this->thumb_maxwidth, $this->thumb_maxheight ); $bgcolor = imagecolorallocate ( $this->tmp_thumbimage, 255, 255, 255 ); imagefill ( $this->tmp_thumbimage, 0, 0, $bgcolor ); imagealphablending ( $this->tmp_thumbimage, false ); imagesavealpha ( $this->tmp_thumbimage, true ); break; default : $this->tmp_thumbimage = ""; break; } } //创建临时图片(LOGO水印) private function gen_tmpimage_waterlogo() { $ext = $this->getImgext ( $this->watermark_logo ); switch ($ext) { case 1 : $this->tmp_waterimage = imagecreatefromgif ( $this->watermark_logo ); $bgcolor = imagecolorallocate ( $this->tmp_waterimage, 0, 0, 0 ); $bgcolortrans = imagecolortransparent ( $this->tmp_waterimage, $bgcolor ); break; case 2 : $this->tmp_waterimage = imagecreatefromjpeg ( $this->watermark_logo ); break; case 3 : $this->tmp_waterimage = imagecreatefrompng ( $this->watermark_logo ); imagesavealpha ( $this->tmp_waterimage, true ); break; default : $this->tmp_waterimage = ""; break; } } /* * 获取后缀名 */ public function getImgext($filename) { return exif_imagetype ( $filename ); } //释放资源 public function __destruct() { if (is_object ( $this->tmp_originimage ) == true) { imagedestroy ( $this->tmp_originimage ); } if (is_object ( $this->tmp_thumbimage ) == true) { imagedestroy ( $this->tmp_thumbimage ); } if (is_object ( $this->tmp_waterimage ) == true) { imagedestroy ( $this->tmp_waterimage ); } }}php 图片操作类,支持生成缩略图,添加水印,上传缩略图的更多相关文章
- bootstrap-wysiwyg 结合 base64 解码 .net bbs 图片操作类
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Dr ...
- 适用于各浏览器支持图片预览,无刷新异步上传js插件
文件上传无疑是web应用中一个非常常用的功能,不管是PHP.jsp还是aspx.mvc等都会需要文件上传,但是众所周知当使用自带的文件上传功能时总会出现页面刷新的情况.当然现在有了html5这个好东西 ...
- DedecmsV5.7本地上传缩略图无法自动添加水印的解决方法
问题:dedecms后台 系统->图片水印设置 图片水印设置有开启了,但是本地上传缩略图无法自动添加水印 网上有很多资料,所以记录一下 1.打开dede(实际项目后台文件夹)/archives_ ...
- javascript 图片上传缩略图预览
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="C ...
- Dedecms本地上传缩略图无法自动添加水印的解决方法
客户遇到一个问题,DEDECMS(V5.7)后台添加文档时,本地上传缩略图无法自动添加水印(系统设置里的图片水印设置没有问题),找了半天,终于找到了解决方法,留个记号: 打开dede/archives ...
- phpcms v9升级后台无法上传缩略图的原因分析
phpcms V9 是目前国内使用人数最多的一款开源免费的CMS系统,正是由于他的免费性,开源性,以及其自身的功能性比较强大,所以倍受许多站长朋友们的亲来,以及许多的公司的喜欢.phpcms也为了完善 ...
- web自动化测试难点 滚动条操作、日期框处理、上传文件
如何把页面滑到最低部? 一般来说,做web自动化测试时,不需要单独写代码,把页面滑到可见,因为click操作,只要是元素存在并且加载出来了,就可以点击到,无需另外写滑动元素的代码. 如果特殊情况需要滑 ...
- bootstrap-wysiwyg 结合 base64 解码 .net bbs 图片操作类 (二) 图片裁剪
图片裁剪参见: http://deepliquid.com/projects/Jcrop/demos.php?demo=thumbnail 一个js插件 http://www.mikes ...
- C#——图片操作类简单封装
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Dr ...
随机推荐
- grep和管道
1.管道命令: 可以连接多个Linux命令 命令1 | 命令2 | 命令3 2.grep 正则表达式 从文件或者字符串中搜索字符串 格式:grep ‘’ file 返回符合规则的行 需求:查询 ...
- java虚拟机之GC(转)
垃圾回收主要内容: 1. 那些内存需要回收? 2. 什么时候回收? 3. 如何回收? 垃圾回收主要针对运行时数据区那些区域? 运行时数据区的线程私有区域有:虚拟机栈,本地方法栈,程序计数器等: 栈中的 ...
- >>我要做特工系列 之 CSS 3_animation_向右滑出后下滑并停止
新手入门还没有正式发点啥东西,都是在装潢博客这个家了,到现在为止还是没有装修好..熟悉了这边的发布规范之后会持续在这里记录,给自己留下学习的脚印~ 这正式的第一篇随笔写个使用css3的动画效果. 总感 ...
- 笨办法学Python(三十四)
习题 34: 访问列表的元素 列表的用处很大,但只有你能访问里边的内容时它才能发挥出作用来.你已经学会了按顺序读出列表的内容,但如果你要得到第 5 个元素该怎么办呢?你需要知道如何访问列表中的元素.访 ...
- Linux Mint,Ubuntu 18 ,Deepin15.7 安装mysql 没有提示输入密码,修改root用户密码过程
刚刚装Deepin15.7 和 MySQL5.7 发现没有提示用户输入密码的过程(近日发现Linux Mint 和 Ubuntu18 也适用) 百度了一大堆如何修改root密码 也没什么卵用,终于这篇 ...
- 在CentOS 6.5上安装NodeJS
CentOS的软件源未包含有最新的nodejs, 需要手动编译安装. 首先安装依赖的库与工具 yum install libtool automake autoconf gcc-c++ openssl ...
- CentOS下用rinetd做端口转发
windows下的端口转发一般用的是自带的nat和porttunnel.portmap linux下端口转发映射的程序叫rinetd,启动方法rinetd -c /etc/rinetd.conf , ...
- 预处理-04-#if defined和#if !defined
因为对于一个大程序而言,我们可能要定义很多常量( 不管是放在源文件还是头文件 ),那么我们有时考虑定义某个常量时,我们就必须返回检查原来此常量是否定义,但这样做很麻烦. if defined 宏正是为 ...
- first 和firstordefault的用法 简介
https://www.cnblogs.com/1312mn/p/9212325.html
- Better exception message for missing @RequestBody method parameter
https://jira.spring.io/browse/SPR-12888 Description When I use @RequestBody on one of my controllers ...