截止目前已经改造了4个类:

ubuntu:通过封装验证码类库一步步安装php的gd扩展

自定义MVC框架之工具类-分页类的封装

自定义MVC框架之工具类-文件上传类

图像处理类:

1,图片加水印处理( 支持任意位置与九宫格位置 )

2,图片缩放处理( 等比缩放,不变形裁剪 )

 <?php

 class Image{
//文件路径
protected $path;
//是否允许随机文件名称
protected $enableRandName;
//文件类型
protected $type;
//错误号
protected $errorNo;
//错误信息
protected $errorInfo; public function __construct( $_path = './', $_enableRandName = true ){
$this->path = $_path;
$this->enableRandName = $_enableRandName;
} public function __get( $key ) {
if( $key == 'errorNo' ) {
return $this->errorNo;
}else if( $key == 'errorInfo' ) {
return $this->getErrorInfo();
}
}
protected function getErrorInfo(){
$info = '';
switch( $this->errorNo ){
case 1000:
$info = "水印或者图片源文件不存在";
break;
case 1001:
$info = '水印图片的尺寸(宽或者高)大于图片本身';
break;
}
return $info;
} //获取图片信息
public static function getImageInfo( $imgPath ){
$data = getimagesize( $imgPath );
$info['width'] = $data[0];
$info['height'] = $data[1];
$info['mime'] = $data['mime'];
return $info;
} /*
* @srcImg 原图片
* @waterImg 水印图片
* @pos 水印位置
* @alpha 透明度
* @prefix 水印处理之后的图片前缀
* */
public function waterMark( $srcImg, $waterImg, $pos, $alpha, $prefix = 'ghostwu_' ){
//检查图片和水印是否存在
if( !file_exists( $srcImg )
|| !file_exists( $waterImg ) ) {
$this->errorNo = 1000;
return false;
} //获取图片和水印信息
$srcImageInfo = self::getImageInfo( $srcImg );
$waterImageInfo = self::getImageInfo( $waterImg ); $this->type = explode( '/', $srcImageInfo['mime'] )[1]; //检查水印和图片的尺寸, 水印是否能加在图片上
if( !$this->check( $srcImageInfo, $waterImageInfo ) ) {
$this->errorNo = 1001;
return false;
} //打开图片文件和水印文件资源
$imgRes = self::openImage( $srcImg );
$waterRes = self::openImage( $waterImg ); //计算水印图片位置
$waterPos = $this->calcPosition( $pos, $srcImageInfo, $waterImageInfo ); //合成水印图片
imagecopymerge ( $imgRes, $waterRes, $waterPos['x'], $waterPos['y'], 0, 0, $waterImageInfo['width'], $waterImageInfo['height'], $alpha ); //得到文件的保存名字
$saveName = $this->getFileName( $srcImg, $prefix ); //拼凑完整的文件名称
$fullPath = rtrim( $this->path, '/' ) . '/' . $saveName; //保存添加水印后的文件
$this->saveImage( $imgRes, $fullPath ); imagedestroy( $imgRes );
imagedestroy( $waterRes ); return $fullPath;
} protected function saveImage( $imgRes, $fullPath ){
$func = 'image' . $this->type;
$func( $imgRes, $fullPath );
} protected function getFileName( $imgPath, $prefix ){
if ( $this->enableRandName ) {
$saveName = $prefix . uniqid() . '.' . $this->type;
}else {
$saveName = $prefix . pathinfo( $imgPath )['filename'] . '.' . $this->type;
}
return $saveName;
} protected function calcPosition( $pos, $imageInfo, $waterImageInfo ){
$x = 0; $y = 0;
switch( $pos ) {
case 1: //左上角
$x = 0; $y = 0;
break;
case 2: //上中
$x = ( $imageInfo['width'] - $waterImageInfo['width'] ) / 2;
$y = 0;
break;
case 3: //右上角
$x = $imageInfo['width'] - $waterImageInfo['width'];
$y = 0;
break;
case 4: //左边中间
$x = 0;
$y = ( $imageInfo['height'] - $waterImageInfo['height'] ) / 2;
break;
case 5: //正中间
$x = ( $imageInfo['width'] - $waterImageInfo['width'] ) / 2;
$y = ( $imageInfo['height'] - $waterImageInfo['height'] ) / 2;
break;
case 6: //右边中间
$x = $imageInfo['width'] - $waterImageInfo['width'];
$y = ( $imageInfo['height'] - $waterImageInfo['height'] ) / 2;
break;
case 7: //左下角
$x = 0;
$y = $imageInfo['height'] - $waterImageInfo['height'];
break;
case 8: //中间下面
$x = ( $imageInfo['width'] - $waterImageInfo['width'] ) / 2;
$y = $imageInfo['height'] - $waterInfo['height'];
break;
case 9: //右下角
$x = $imageInfo['width'] - $waterImageInfo['width'];
$y = $imageInfo['height'] - $waterImageInfo['height'];
break;
case 0: //随机位置
$x = mt_rand( 0, $imageInfo['width'] - $waterImageInfo['width'] );
$y = mt_rand( 0, $imageInfo['height'] - $waterImageInfo['height'] );
break;
}
return [ 'x' => $x, 'y' => $y ];
} public static function openImage( $imagePath ){
$mime = self::getImageInfo( $imagePath )['mime'];
switch( $mime ){
case 'image/gif':
$im = imagecreatefromgif( $imagePath );
break;
case 'image/jpeg':
$im = imagecreatefromjpeg( $imagePath );
break;
case 'image/png':
$im = imagecreatefrompng( $imagePath );
break;
case 'image/wbmp':
$im = imagecreatefromwbmp( $imagePath );
break;
}
return $im;
} public function check( $imgInfo, $waterInfo ){
if( $imgInfo['width'] < $waterInfo['width']
|| $imgInfo['height'] < $waterInfo['height'] ){
return false;
}
return true;
} /*
* @srcImg 原图片路径
* @dstImg 目标图片路径
* @newWidth 缩放后新的图片宽度
* @newHeight 缩放后新的图片高度
* */
public function thumb( $srcImg, $newWidth, $newHeight, $prefix="thumb_" ){
$srcIm = self::openImage( $srcImg );
$srcInfo = self::getImageInfo( $srcImg );
$srcW = $srcInfo['width'];
$srcH = $srcInfo['height'];
$this->type = explode( '/', $srcInfo['mime'] )[1];
$ratio_w = $newWidth / $srcW;
$ratio_h = $newHeight / $srcH;
$ratio = 1.0; //缩放后的图片 宽度/高度 都比原图大或者小
if( ( $ratio_w < 1 && $ratio_h < 1 ) || ( $ratio_w > 1 && $ratio_h > 1 ) ) {
if( $ratio_w < $ratio_h ) {
$ratio = $ratio_h;
}else {
$ratio = $ratio_w;
}
$tmp_w = (int)( $newWidth / $ratio );
$tmp_h = (int)( $newHeight / $ratio );
$tmp_im = imagecreatetruecolor( $tmp_w, $tmp_h );
//生成一个以原图片最大边长,比例为ratio的中间图像
imagecopy( $tmp_im, $srcIm, 0, 0, 0, 0, $tmp_w, $tmp_h );
//定义一个目标尺寸的图像
$newIm = imagecreatetruecolor( $newWidth, $newHeight );
imagecopyresampled( $newIm, $tmp_im, 0, 0, 0, 0, $newWidth, $newHeight, $tmp_w, $tmp_h );
}else {
//缩放后的图片 宽度/高度 一个比原图大, 另一个比原图小
$ratio = $ratio_h > $ratio_w ? $ratio_h : $ratio_w; //取比例大的那个值 $tmp_w=(int)($srcW * $ratio);
$tmp_h=(int)($srcH * $ratio);
$tmp_im = imagecreatetruecolor($tmp_w, $tmp_h); imagecopyresampled($tmp_im, $srcIm, 0, 0, 0, 0, $tmp_w, $tmp_h, $srcW, $srcH ); $newIm = imagecreatetruecolor($newWidth, $newHeight);
imagecopy($newIm, $tmp_im, 0, 0, 0, 0, $newWidth, $newHeight);
}
//处理后的文件的保存名字
$saveName = $this->getFileName( $newIm, $prefix ); //拼凑完整的文件名称
$fullPath = rtrim( $this->path, '/' ) . '/' . $saveName; $this->saveImage( $newIm, $fullPath ); imagedestroy( $newIm ); return $fullPath;
}
} $img = new Image();
//$img->waterMark( '1.jpg', 'logo.png', 5, 30 );
echo $img->thumb( '1.jpg', 330, 495 ); ?>

自定义MVC框架之工具类-图像处理类的更多相关文章

  1. 自定义MVC框架之工具类-模型类

    截止目前已经改造了5个类: ubuntu:通过封装验证码类库一步步安装php的gd扩展 自定义MVC框架之工具类-分页类的封装 自定义MVC框架之工具类-文件上传类 自定义MVC框架之工具类-图像处理 ...

  2. 自定义MVC框架之工具类-文件上传类

    截止目前已经改造了3个类: ubuntu:通过封装验证码类库一步步安装php的gd扩展 自定义MVC框架之工具类-分页类的封装 该文件上传类功能如下: 1,允许定制上传的文件类型,文件mime信息,文 ...

  3. 自定义MVC框架之工具类-分页类的封装

    以前写过一个MVC框架,封装的有点low,经过一段时间的沉淀,打算重新改造下,之前这篇文章封装过一个验证码类. 这次重新改造MVC有几个很大的收获 >全部代码都是用Ubuntu+Vim编写,以前 ...

  4. Java Web自定义MVC框架详解 (转)

    转自:http://blog.csdn.net/jackfrued/article/details/42774459 最近给学生讲Java Web,希望他们能够在学完这部分内容后自己实现一个MVC框架 ...

  5. 自定义MVC框架

    我们在学习自定义MVC框架的时候常常会听到Model1 ,Model2和MVC.那么什么是Model1 什么是Model2什么又是MVC呢? 什么是Model1? Model1就是一种纯jsp开发技术 ...

  6. Struts2 自定义MVC框架

    一.Model1与Model2: Model1:就是一种纯jsp开发技术,将业务逻辑代码和视图渲染代码杂糅在一起. Model2:Model2是在Model1的基础上,将业务逻辑的代码分离开来,单独形 ...

  7. 第一章 自定义MVC框架

    第一章  自定义MVC框架1.1 MVC模式设计    组成:Model:模型,用于数据和业务的处理          View :视图,用于数据的显示          Controller:控制器 ...

  8. c#自定义ORM框架---(泛型&反射&实体类扩展属性<附带通用增、删、查、改>)

    该教材主要是运用到泛型.反射和实体类扩展属性 步骤一.建立扩展属性类 实体类扩展属性要继承Attribute基类完成 [AttributeUsage(AttributeTargets.Property ...

  9. 使用Intellij Idea自定义MVC框架

    ---恢复内容开始--- 今天我学习了自定义一个简单的MVC框架,这个我们首先要知道什么是MVC框架! MVC框架: MVC全名是Model View Controller,是模型(model)-视图 ...

随机推荐

  1. <转>(笔记)正则表达式的几种引擎

    这篇主要是基于<精通正则表达式>的一篇读书笔记,因为书还没看完,可能以后还会有相关的笔记.(工作以后看书的效率真的很低啊……) 正则引擎主要可以分为基本不同的两大类:一种是DFA(确定性有 ...

  2. Akka(0):聊聊对Akka的初步了解和想法

    前一段时间一直沉浸在函数式编程模式里,主要目的之一是掌握一套安全可靠的并发程序编程方法(concurrent programming),最终通过开源项目FunDA实现了单机多核CPU上程序的并行运算. ...

  3. python爬虫实践教学

    i春秋作家:Mochazz 一.前言 这篇文章之前是给新人培训时用的,大家觉的挺好理解的,所以就分享出来,与大家一起学习.如果你学过一些python,想用它做些什么又没有方向,不妨试试完成下面几个案例 ...

  4. window.location API

    概述 今天被自己鄙视了,竟然不会用window.location.search进行页面传值.现在好好总结下window.location API,记录一下供以后开发时参考,相信对其它人也有用. 页面传 ...

  5. Oracle日期格式化以及extract函数的使用

    由于业务需要,这两天在学习Oracle,发现Oracle里面的日期它会给你转成一种很不习惯的格式,于是想着怎么样把它弄成年.月.日的格式来显示,查资料.看文档,最终找到解决办法了,其实是用到了to_c ...

  6. 08-02 Java 代码块,代码块执行的先后顺序问题

    代码块 /* 代码块:在Java中,使用{}括起来的代码被称为代码块. 根据其位置和声明的不同,可以分为 局部代码块:局部位置,用于限定变量的生命周期. 构造代码块:在类中的成员位置,用{}括起来的代 ...

  7. MVC3学习:利用mvc3+ajax实现删除记录

    首先根据模板生成list视图,上面就会有一个delete的链接,但是模板自带的这种删除,需要另外再打开一个删除页,再进行删除.我们可以利用ajax来改写,实现在当前页删除. 在视图上面,将原来的 @H ...

  8. java.lang.ClassCastException: java.math.BigDecimal cannot be cast to java.lang.String错误的解决方法

    mmobjectid是在Oracle数据库中对应的是Number类型的,在JavaBean中定义的是Long类型的. List<BigDecimal> mmobjidAllFromMars ...

  9. spring jpa : 多条件查询

    https://www.cnblogs.com/Donnnnnn/p/6277872.html 方式一: 第一步:EmpAccNumService package com.payease.scford ...

  10. Spring Boot打包war jar 部署tomcat

    概述 1.Spring Boot聚合工程打包war部署Tomcat 2.Spring Boot打包Jar,通过Java -jar直接运行. 3.提供完整pom.xml测试项目 至github 4.项目 ...