<?php
/**
file: image.class.php 类名为Image
图像处理类,可以完成对各种类型的图像进行缩放、加图片水印和剪裁的操作。
http://www.lai18.com
*/
class Image {
/* 图片保存的路径 */
private $path;

/**
* 实例图像对象时传递图像的一个路径,默认值是当前目录
* @param string $path 可以指定处理图片的路径
*/
function __construct($path="./"){
$this->path = rtrim($path,"/")."/";
}

/**
* 对指定的图像进行缩放
* @param string $name 是需要处理的图片名称
* @param int $width 缩放后的宽度
* @param int $height 缩放后的高度
* @param string $qz 是新图片的前缀
* @return mixed 是缩放后的图片名称,失败返回false;
*/
function thumb($name, $width, $height,$qz="th_"){
/* 获取图片宽度、高度、及类型信息 */
$imgInfo = $this->getInfo($name);
/* 获取背景图片的资源 */
$srcImg = $this->getImg($name, $imgInfo);
/* 获取新图片尺寸 */
$size = $this->getNewSize($name,$width, $height,$imgInfo);
/* 获取新的图片资源 */
$newImg = $this->kidOfImage($srcImg, $size,$imgInfo);
/* 通过本类的私有方法,保存缩略图并返回新缩略图的名称,以"th_"为前缀 */
return $this->createNewImage($newImg, $qz.$name,$imgInfo);
}

/**
* 为图片添加水印
* @param string $groundName 背景图片,即需要加水印的图片,暂只支持GIF,JPG,PNG格式
* @param string $waterName 图片水印,即作为水印的图片,暂只支持GIF,JPG,PNG格式
* @param int $waterPos 水印位置,有10种状态,0为随机位置;
* 1为顶端居左,2为顶端居中,3为顶端居右;
* 4为中部居左,5为中部居中,6为中部居右;
* 7为底端居左,8为底端居中,9为底端居右;
* @param string $qz 加水印后的图片的文件名在原文件名前面加上这个前缀
* @return mixed 是生成水印后的图片名称,失败返回false
*/
function waterMark($groundName, $waterName, $waterPos=0, $qz="wa_"){
/*获取水印图片是当前路径,还是指定了路径*/
$curpath = rtrim($this->path,"/")."/";
$dir = dirname($waterName);
if($dir == "."){
$wpath = $curpath;
}else{
$wpath = $dir."/";
$waterName = basename($waterName);
}
/*水印图片和背景图片必须都要存在*/
if(file_exists($curpath.$groundName) && file_exists($wpath.$waterName)){
$groundInfo = $this->getInfo($groundName); //获取背景信息
$waterInfo = $this->getInfo($waterName, $dir); //获取水印图片信息
/*如果背景比水印图片还小,就会被水印全部盖住*/
if(!$pos = $this->position($groundInfo, $waterInfo, $waterPos)){
echo '水印不应该比背景图片小!';
return false;
}

$groundImg = $this->getImg($groundName, $groundInfo); //获取背景图像资源
$waterImg = $this->getImg($waterName, $waterInfo, $dir); //获取水印图片资源

/* 调用私有方法将水印图像按指定位置复制到背景图片中 */
$groundImg = $this->copyImage($groundImg, $waterImg, $pos, $waterInfo);
/* 通过本类的私有方法,保存加水图片并返回新图片的名称,默认以"wa_"为前缀 */
return $this->createNewImage($groundImg, $qz.$groundName, $groundInfo);

}else{
echo '图片或水印图片不存在!';
return false;
}
}

/**
* 在一个大的背景图片中剪裁出指定区域的图片
* @param string $name 需要剪切的背景图片
* @param int $x 剪切图片左边开始的位置
* @param int $y 剪切图片顶部开始的位置
* @param int $width 图片剪裁的宽度
* @param int $height 图片剪裁的高度
* @param string $qz 新图片的名称前缀
* @return mixed 裁剪后的图片名称,失败返回false;
*/
function cut($name, $x, $y, $width, $height, $qz="cu_"){
$imgInfo=$this->getInfo($name); //获取图片信息
/* 裁剪的位置不能超出背景图片范围 */
if( (($x+$width) > $imgInfo['width']) || (($y+$height) > $imgInfo['height'])){
echo "裁剪的位置超出了背景图片范围!";
return false;
}

$back = $this->getImg($name, $imgInfo); //获取图片资源
/* 创建一个可以保存裁剪后图片的资源 */
$cutimg = imagecreatetruecolor($width, $height);
/* 使用imagecopyresampled()函数对图片进行裁剪 */
imagecopyresampled($cutimg, $back, 0, 0, $x, $y, $width, $height, $width, $height);
imagedestroy($back);
/* 通过本类的私有方法,保存剪切图并返回新图片的名称,默认以"cu_"为前缀 */
return $this->createNewImage($cutimg, $qz.$name,$imgInfo);
}

/* 内部使用的私有方法,用来确定水印图片的位置 */
private function position($groundInfo, $waterInfo, $waterPos){
/* 需要加水印的图片的长度或宽度比水印还小,无法生成水印 */
if( ($groundInfo["width"]<$waterInfo["width"]) || ($groundInfo["height"]<$waterInfo["height"]) ) {
return false;
}
switch($waterPos) {
case 1: //1为顶端居左
$posX = 0;
$posY = 0;
break;
case 2: //2为顶端居中
$posX = ($groundInfo["width"] - $waterInfo["width"]) / 2;
$posY = 0;
break;
case 3: //3为顶端居右
$posX = $groundInfo["width"] - $waterInfo["width"];
$posY = 0;
break;
case 4: //4为中部居左
$posX = 0;
$posY = ($groundInfo["height"] - $waterInfo["height"]) / 2;
break;
case 5: //5为中部居中
$posX = ($groundInfo["width"] - $waterInfo["width"]) / 2;
$posY = ($groundInfo["height"] - $waterInfo["height"]) / 2;
break;
case 6: //6为中部居右
$posX = $groundInfo["width"] - $waterInfo["width"];
$posY = ($groundInfo["height"] - $waterInfo["height"]) / 2;
break;
case 7: //7为底端居左
$posX = 0;
$posY = $groundInfo["height"] - $waterInfo["height"];
break;
case 8: //8为底端居中
$posX = ($groundInfo["width"] - $waterInfo["width"]) / 2;
$posY = $groundInfo["height"] - $waterInfo["height"];
break;
case 9: //9为底端居右
$posX = $groundInfo["width"] - $waterInfo["width"];
$posY = $groundInfo["height"] - $waterInfo["height"];
break;
case 0:
default: //随机
$posX = rand(0,($groundInfo["width"] - $waterInfo["width"]));
$posY = rand(0,($groundInfo["height"] - $waterInfo["height"]));
break;
}
return array("posX"=>$posX, "posY"=>$posY);
}

/* 内部使用的私有方法,用于获取图片的属性信息(宽度、高度和类型) */
private function getInfo($name, $path=".") {
$spath = $path=="." ? rtrim($this->path,"/")."/" : $path.'/';
$data = getimagesize($spath.$name);
$imgInfo["width"] = $data[0];
$imgInfo["height"] = $data[1];
$imgInfo["type"] = $data[2];

return $imgInfo;
}

/*内部使用的私有方法, 用于创建支持各种图片格式(jpg,gif,png三种)资源 */
private function getImg($name, $imgInfo, $path='.'){
$spath = $path=="." ? rtrim($this->path,"/")."/" : $path.'/';
$srcPic = $spath.$name;
switch ($imgInfo["type"]) {
case 1: //gif
$img = imagecreatefromgif($srcPic);
break;
case 2: //jpg
$img = imagecreatefromjpeg($srcPic);
break;
case 3: //png
$img = imagecreatefrompng($srcPic);
break;
default:
return false;
break;
}
return $img;
}

/* 内部使用的私有方法,返回等比例缩放的图片宽度和高度,如果原图比缩放后的还小保持不变 */
private function getNewSize($name, $width, $height, $imgInfo){
$size["width"] = $imgInfo["width"]; //原图片的宽度
$size["height"] = $imgInfo["height"]; //原图片的高度
if($width < $imgInfo["width"]){
$size["width"]=$width; //缩放的宽度如果比原图小才重新设置宽度
}
if($height < $imgInfo["height"]){
$size["height"] = $height; //缩放的高度如果比原图小才重新设置高度
}
/* 等比例缩放的算法 */
if($imgInfo["width"]*$size["width"] > $imgInfo["height"] * $size["height"]){
$size["height"] = round($imgInfo["height"]*$size["width"]/$imgInfo["width"]);
}else{
$size["width"] = round($imgInfo["width"]*$size["height"]/$imgInfo["height"]);
}
return $size;
}

/* 内部使用的私有方法,用于保存图像,并保留原有图片格式 */
private function createNewImage($newImg, $newName, $imgInfo){
$this->path = rtrim($this->path,"/")."/";
switch ($imgInfo["type"]) {
case 1: //gif
$result = imageGIF($newImg, $this->path.$newName);
break;
case 2: //jpg
$result = imageJPEG($newImg,$this->path.$newName);
break;
case 3: //png
$result = imagePng($newImg, $this->path.$newName);
break;
}
imagedestroy($newImg);
return $newName;
}

/* 内部使用的私有方法,用于加水印时复制图像 */
private function copyImage($groundImg, $waterImg, $pos, $waterInfo){
imagecopy($groundImg, $waterImg, $pos["posX"], $pos["posY"], 0, 0, $waterInfo["width"],$waterInfo["height"]);
imagedestroy($waterImg);
return $groundImg;
}

/* 内部使用的私有方法,处理带有透明度的图片保持原样 */
private function kidOfImage($srcImg, $size, $imgInfo){
$newImg = imagecreatetruecolor($size["width"], $size["height"]);
$otsc = imagecolortransparent($srcImg);
if( $otsc >= 0 && $otsc < imagecolorstotal($srcImg)) {
$transparentcolor = imagecolorsforindex( $srcImg, $otsc );
$newtransparentcolor = imagecolorallocate(
$newImg,
$transparentcolor['red'],
$transparentcolor['green'],
$transparentcolor['blue']
);
imagefill( $newImg, 0, 0, $newtransparentcolor );
imagecolortransparent( $newImg, $newtransparentcolor );
}
imagecopyresized( $newImg, $srcImg, 0, 0, 0, 0, $size["width"], $size["height"], $imgInfo["width"], $imgInfo["height"] );
imagedestroy($srcImg);
return $newImg;
}
}

php 图像处理类的更多相关文章

  1. 自定义MVC框架之工具类-图像处理类

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

  2. CGAffineTransform 图像处理类

    CGAffineTransform 介绍 概述 CGAffineTransform是一个用于处理形变的类,其可以改变控件的平移.缩放.旋转等,其坐标系统采用的是二维坐标系,即向右为x轴正方向,向下为y ...

  3. [转] AForge.NET 图像处理类

    https://www.nuget.org/packages?q=AForge.NET https://baike.baidu.com/item/AForge.NET/114415?fr=aladdi ...

  4. c++ MFC图像处理CImage类常用操作代码

    原文作者:aircraft 原文地址:https://www.cnblogs.com/DOMLX/p/9598974.html MFC图像处理CImage类常用操作 CImage类头文件为#inclu ...

  5. CodeIgniter类的使用

    Email 类 在配置文件中设置 Email 参数 如果您不想使用使用上述方法设定参数,您可以把它们放入一个配置文件.创建一个新文件称为email.php ,添加$config数组在该文件中.然后将该 ...

  6. 用CImage类来显示PNG、JPG等图片

    系统环境:Windows 7软件环境:Visual Studio 2008 SP1本次目的:实现VC单文档.对话框程序显示图片效果 CImage 是VC.NET中定义的一种MFC/ATL共享类,也是A ...

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

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

  8. PHP的图片处理类(缩放、加图片水印和剪裁)

    <!--test.php文件内容--> <?php //包含这个类image.class.php include "image.class.php"; $img ...

  9. PHP14 动态图像处理

    学习要点 如何使用PHP中的GD库 设计验证码类 PHP图片处理 设计图像图处理类 如何使用PHP中的GD库 在网站上GD库通常用来生成缩略图,或者用来对图片加水印,或者用来生成汉字验证码,或者对网站 ...

随机推荐

  1. .net程序在无.net环境下运行

    看了篇文章  测试了下竟然真的可以运行  测试环境是XP下  没有装NET2.0的情况下 可以运行的   不过需要每次输入命令才能运行 点击后还是会报错 原文如下 众所周知,.net程序必须运行在.n ...

  2. javascript windows对象

    1.windows对象方法 2.计时器方法 3.计时器setInterval() <!DOCTYPE HTML> <html> <head> <meta ht ...

  3. AngularJs应用

    引用angularjs文件 AngularJS 应用组成如下:View(视图), 即 HTML.Model(模型), 当前视图中可用的数据.Controller(控制器), 即 JavaScript ...

  4. hdu 1531 King

    首先吐槽一下这个题目的题意描述,我看了半天才明白. 下标全部都是乱标的!!!!出题者能不能规范一点下标的写法!!!! 差分约束系统 #include<cstdio> #include< ...

  5. js--事件对象的理解3

    实例2: 跟随鼠标的DIV-- <script> document.onmousemove=function (ev) { var oEvent=ev||event; var oDiv=d ...

  6. [妙味JS基础]第十一课:字符串、查找高亮显示

    知识点总结 字符串方法 var str = '2014年新春快乐哈' * length 字符串长度 str.length =>10 ------------------------------- ...

  7. Yii CDBCriteria常用方法

    Yii CDbCriteria 常用方法 注:$c = new CDbCriteria();是ActiveRecord的一种写法,使ActiveRecord更加灵活,而不是手册中DAO(PDO)和Qu ...

  8. hdu_5961_传递(bitset)

    题目链接:hdu_5961_传递 题意: 中文,不解释 题解: 上bitset卡常,很优美的就过去了 #include<bits/stdc++.h> #define F(i,a,b) fo ...

  9. hdu_5908_Abelian Period(暴力)

    题目链接:hdu_5908_Abelian Period 题意: 给你n个数字,让你找出所有的k,使得把这n个数字分为k分,并且每份的数字种类和个数必须相同 题解: 枚举k,首先k必须是n的约数,然后 ...

  10. 5、Struts2自定义拦截器

    一.拦截器相关知识 1.Struts2框架剖析 Holly版本生活案例: 影视公司(拍电影)    ActionMapper 传媒公司(包装明星) ActionMapping 明星           ...