今天的实现目标就是使用GD库完成对图片加水印和图

片缩略图两个功能

动身前逻辑准备

属性:
路径 功能:
构造方法 生成水印的方法
获取 图片信息
获取位置信息(123 456 789)
创建图片资源
合并图片资源
重新命名
保存图片
生成缩 略图的方法
获取图片信息
获取需要缩放的图片大小
创建图片资源
处理一下可能出现的黑边问题 重新命名
保存图片

接下来将文字描述转换为代码

首先,创建一个Image类,包含属性和构造方

class Image()
{
//定义图片路径
static $path = '/';
//构造方法 public function __construct($path = '/') {
$this->path = rtrim($path,'').'/';
} }

接下来完善类中的方法

  • 获取图片信息
static private function getImageInfo($imgPath)

{
$info = getimagesize($imgPath);
return array(
'width' => $info [0],
'height'=> $info[1],
'mime' => $info['mime'], 'name' => basename($imgPath)
);
}
  • 检查目标图片与水印图片大小是不是

匹配

static private function checksize($dstImgInfo,$waterImgInfo)
{
if ($waterImgInfo['width'] > $dstImgInfo['width'] || $waterImgInfo['height'] > $dstImgInfo ['height'])
{
return false;
} else {
return true;
}
}
  • 根据需要

确定水印的位置

这里将图片分成九宫格

1 2 3

4 5 6

7 8 9

static private function getPosition($dstImgInfo,$waterImgInfo,$postion)
{
switch ($position) {
case 1:
$x = 0;
$y = 0;
break;
case 2: $x = ceil(($desImgInfo['width'] - $waterImgInfo['width']) / 2);
$y = 0; break;
case 3:
$x = $dstImgInfo['width'] - $waterImgInfo['width'];
$y = 0;
case 4:
$x = 0;
$y = ceil(($dstImgInfo['height'] - $waterImgInfo ['height']) / 2);
break;
case 5:
$x = ceil(($desImgInfo['width'] - $waterImgInfo['width']) / 2);
$y = ceil(($dstImgInfo['height'] - $waterImgInfo ['height']) / 2);
break;
case 6:
$x = $dstImgInfo['width'] - $waterImgInfo['width'];
$y = ceil(($dstImgInfo['height'] - $waterImgInfo['height']) / 2);
break;
case 7:
$x = 0;
$y = $dstImgInfo['height'] - $waterImgInfo['height'];
break;
case 8:
$x = ceil(($desImgInfo ['width'] - $waterImgInfo['width']) / 2);
$y = $dstImgInfo['height'] - $waterImgInfo['height'];
break;
case 9:
$x = $dstImgInfo['width'] - $waterImgInfo['width'];
$y = $dstImgInfo['height'] - $waterImgInfo['height'];
} return [
'x' => $x,
'y' => $y ];
}
  • 根据图片的mime类型创建图片资源
static private function createImgRes

($imgPath,$imgInfo)
{
switch ($imgInfo['mime']) {
case 'image/jpg':
case 'image/jpeg':
case 'image/pjpeg':
$res = imagecreatefromjpeg($imgPath); break;
case 'image/png':
case 'image/x-png':
$res = imagecreatefrompng ($imgPath);
break;
case 'image/gif':
$res = imagecreatefromgif ($imgPath);
break;
case 'image/bmp':
case 'image/wbmp':
$res = imagecreatefromwbmp($imgPath);
break;
default:
exit('图片我们不支持!'); break;
}
return $res;
}
  • 给原图加上水印
static 

private function merge($dstImgRes,$waterImgRes,$waterImgInfo,$pos,$opacity)
{ imagecopymerge($dstImgRes, $waterImgRes, $pos['x'], $pos['y'], 0, 0, $waterImgInfo ['width'], $waterImgInfo['height'], $opacity); return $dstImgRes;
}
  • 保存图片
static private function saveImg($newImgRes,$newPath,$dstImgInfo)
{ switch ($dstImgInfo['mime']) {
case 'image/jpg':
case 'image/jpeg':
case 'image/pjpeg':
$res = imagejpeg($newImgRes,$newPath);
break;
case 'image/png': case 'image/x-png':
$res = imagepng($newImgRes,$newPath);
break;
case 'image/gif':
$res = imagegif($imgPath);
break;
case 'image/bmp':
case 'image/wbmp':
$res = imagewbmp($newImgRes,$newPath);
break;
default: exit('您的破图片我们不支持!');
break;
}
}
  • 完成水印生成的公共方法

/* $dstImg:原图像
*$waterImg:水印图片
*$postion:水印的位置
*$prefix:最终生成水印的图片名称前缀 *$opacity:水印透明度
*/
static public function water($dstImg,$waterImg,$position = 9,$prefix = 'water_',$opacity = 50)
{
//判断图片是否存在
$dstImg = self::$path.$dstImg; if(!file_exists($dstImg))
{
exit('目标图片不存在');
}
if(!file_exists ($waterImg))
{
exit('水印图片不存在');
} //通过自己定义的函数来获取图片和水印 图片的信息
$dstImgInfo = self::getImageInfo($dstImg);
$waterImgInfo = self::getImageInfo ($waterImg); //检查图片大小的函数
if(!self::checkSize($dstImgInfo,$waterImgInfo))
{ exit('水印图片大小不能超过目标图片的大小');
}
//获取水印在目标图片的位置 $pos = self::getPosition($dstImgInfo,$waterImgInfo,$position); //创建图片资源,准备合并 $dstImgRes = self::createImgRes($dstImg,$dstImgInfo);
$waterImgRes = self::createImgRes ($waterImg,$waterImgInfo);
//合并图片,生成新图片
$newImgRes = self::merge ($dstImgRes,$waterImgRes,$waterImgInfo,$pos,$opacity);
$newPath = self::$path. $prefix.uniqid().$dstImgInfo['name'];
imagedestroy($dstImgRes);
imagedestroy ($waterImgRes);
imagedestroy($newImgRes);
//生成新图片
self::saveImg($newImgRes, $newPath,$dstImgInfo); return $newPath;
}

上述面是给图片加水印的全部方法,接下来完成

图片缩略图

//生成缩略图的方法
static public function thump($img,$width,$height, $prefix = 'thump_')
{
if(!file_exists($img))
{ exit('破图片不存在');
}
//获取图片的信息
//getImageInfo()自 定义函数
$imgInfo = self::getImageInfo($img);
//创建图片资源 //createImgRes()自定义函数
$imgRes = self::createImgRes($img, $imgInfo);
//获取新的大小
//getNewSize()自定义函数--->得到最新的大小 $newSize = self::getNewSize($width,$height,$imgInfo);
//解决黑边问题 //kidOfImage()自定义函数
$newImgRes = self::kidOfImage($imgRes, $newSize, $imgInfo);
//拼装缩略后的新的图片名字
$newPath = $prefix.$newSize['width'].'X'.$newSize['height'].$imgInfo['name'];
//保存图片 self::saveImg($newImgRes,$newPath,$imgInfo); imagedestroy($newImgRes); //返回新的路径
return $newPath;
}
  • 重新计算缩略后的图成比例的宽

高问题


static private function getNewSize($width,$height,$imgInfo)
{ $size = []; //判断缩略后的图的宽度,是不是比原图小
if($imgInfo ['width'] > $width)
{
$size['width'] = $width; }
//判断缩略图的高度是不是比原图小
if($imgInfo['height'] > $height)
{
$size['height'] = $height;
} //即使小了,但是不成比例也不可以
//如果缩略后的宽度是合适的,那么按 照比例重新设高度
if($imgInfo['width'] * $size['width'] > $imgInfo['height'] * $imgInfo['height'])
{
$size['height'] = $imgInfo ['height'] * $size['width'] / $imgInfo['width'];
}else{
// 缩略后的高度是合适的,按照比例重新设置宽度
$size['width'] = $imgInfo ['width'] * $size['height'] / $imgInfo['height'];
}
return $size;
}
  • 解决可能出现的黑边问题
	static 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;
}
}

使用方式

Image::water('zhyunfe-com.jpg','2.jpg');

Image::thump('./zhyunfe-com.jpg',50,50);

PHP面向对象——GD库实现图片水印和缩略图的更多相关文章

  1. php使用GD库实现图片水印和缩略图——封装成类

    学完了如何使用GD库来实现对图片的各种处理,那么我们可以发现,不管哪种方法,都有相似之处,如果我们把这些相似的地方和不相似的地方都封装成类,这样就可以提升代码的速度,而且节省了很多时间,废话不多说,来 ...

  2. php使用GD库实现图片水印和缩略图——生成图片缩略图

    今天呢,就来学习一下在php中使用PD库来实现对图片水印的文字水印方法,不需要PS哦! 首先,准备素材 (1)准备一张图片 (2)准备一张水印(最好是透明的,即背景是白色底) (3)准备一中字体(在电 ...

  3. php使用GD库实现图片水印和缩略图——给图片添加图片水印

    今天呢,就来学习一下在php中使用PD库来实现对图片水印的文字水印方法,不需要PS哦! 首先,准备素材 (1)准备一张图片 (2)准备一张水印(最好是透明的,即背景是白色底) (3)准备一中字体(在电 ...

  4. php使用GD库实现图片水印和缩略图——给图片添加文字水印

    今天呢,就来学习一下在php中使用PD库来实现对图片水印的文字水印方法,不需要PS哦! 首先,准备素材 (1)准备一张图片 (2)准备一张水印(最好是透明的,即背景是白色底) (3)准备一中字体(在电 ...

  5. 使用GD库做图片水印

    png图片作为水印加到其他类型图片后,背景变黑色 原因: imagecopy函数拷贝时可以保留png图像的原透明信息,而imagecopymerge却不支持图片的本身的透明拷贝. 然后直接上代码: / ...

  6. php用GD库给图片添加水印

    php用GD库给图片添加文字水印,整个代码比较简单,DEMO如下: <?php /*打开图片*/ //1.配置图片路径 $src = "aeroplane.jpg"; //2 ...

  7. php课程 8-32 如何使用gd库进行图片裁剪和缩放

    php课程 8-32 如何使用gd库进行图片裁剪和缩放 一.总结 一句话总结:图片缩放到图片裁剪就是改变原图截取的位置以及截取的宽高. 1.电商网站那么多的图片,如果全部加载卡得慢的很,所以他们是怎么 ...

  8. php 简单的学习GD库绘制图片并传回给前端实现方式

    1.基本的GD库绘制图片汇总 2.后台实现小案例 <?php // $img = imagecreatetruecolor(200,40); // var_dump($img); // 利用GD ...

  9. php 使用GD库压缩图片,添加文字图片水印

    先上一个工具类,提供了压缩,添加文字.图片水印等方法: image.class.php <?php class Image { private $info; private $image; pu ...

随机推荐

  1. android 点滴记录

    1.AndroidM环境下,在framework层添加代码会对jar包的package name进行检查,并提示”unknown package name of class file”怎么解决? 产生 ...

  2. <转>SQL的执行顺序

    SQL 不同于与其他编程语言的最明显特征是处理代码的顺序.在大数编程语言中,代码按编码顺序被处理,但是在SQL语言中,第一个被处理的子句是FROM子句,尽管SELECT语句第一个出现,但是几乎总是最后 ...

  3. 移位操作<< >> 小计

    最近看代码移位操作的使用比较多,通过查阅资料搞明白了之前一直不明白的一个问题 移位效果: 左移位<<: 相当于乘以  2的左移位的相应次方   例如: x << 3    =& ...

  4. 前端面试题整理(html篇)

    1.Doctype作用?标准模式与兼容模式各有什么区别? <!DOCTYPE>声明位于位于HTML文档中的第一行,处于 <html> 标签之前.告知浏览器的解析器用什么文档标准 ...

  5. 使用 Redis 统计在线用户人数

    在构建应用的时候, 我们经常需要对用户的一举一动进行记录, 而其中一个比较重要的操作, 就是对在线的用户进行记录. 本文将介绍四种使用 Redis 对在线用户进行记录的方案, 这些方案虽然都可以对在线 ...

  6. 如何使用Grunt(好文)

    Grunt 是什么? Grunt 基于Node.js之上,是一个以任务处理为基础的命令行工具,可以减少优化开发版本为发布版本所需的人力和时间,从而加速开发流程.它的工作原理是把这 些工作整合为不同的任 ...

  7. 支持wmv、mpg、mov、avi格式的网页视频播放代码

    这2天一直在整金网奖的相关项目,比较头大的就是网页视频播放了,需要考虑各种不同格式的视频,然后找相应的视频播放器. 这次使用了2种方法对这些视频进行处理: 1.使用ckplayer网页视频播放器 ck ...

  8. DPM,DEM,DDPM的区别

    此文来自我在CFD中国论坛中的一篇回复:http://www.cfd-china.com/topic/58/dem%E5%92%8Cdpm/21 正好这几天在研究fluent里的DEM,DPM和DDP ...

  9. 解决windows 10 9926 中vmware安装的虚拟机无法桥接上网的问题

    从windows 10 出来之后就安装了使用,但一直有一个问题直到9926也没有解决,那就是vmware下的虚拟机无法桥接上网,但NAT方式正常.发现有一种办法可以实现桥接方式上网.但这种方式下本机与 ...

  10. Heka 编译安装后 运行报错 panic: runtime error: cgo argument has Go pointer to Go pointer

    Heka 编译安装后 运行报错 panic: runtime error: cgo argument has Go pointer to Go pointer 解决办法: 1.  Start heka ...