PHP面向对象——GD库实现图片水印和缩略图
今天的实现目标就是使用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库实现图片水印和缩略图的更多相关文章
- php使用GD库实现图片水印和缩略图——封装成类
学完了如何使用GD库来实现对图片的各种处理,那么我们可以发现,不管哪种方法,都有相似之处,如果我们把这些相似的地方和不相似的地方都封装成类,这样就可以提升代码的速度,而且节省了很多时间,废话不多说,来 ...
- php使用GD库实现图片水印和缩略图——生成图片缩略图
今天呢,就来学习一下在php中使用PD库来实现对图片水印的文字水印方法,不需要PS哦! 首先,准备素材 (1)准备一张图片 (2)准备一张水印(最好是透明的,即背景是白色底) (3)准备一中字体(在电 ...
- php使用GD库实现图片水印和缩略图——给图片添加图片水印
今天呢,就来学习一下在php中使用PD库来实现对图片水印的文字水印方法,不需要PS哦! 首先,准备素材 (1)准备一张图片 (2)准备一张水印(最好是透明的,即背景是白色底) (3)准备一中字体(在电 ...
- php使用GD库实现图片水印和缩略图——给图片添加文字水印
今天呢,就来学习一下在php中使用PD库来实现对图片水印的文字水印方法,不需要PS哦! 首先,准备素材 (1)准备一张图片 (2)准备一张水印(最好是透明的,即背景是白色底) (3)准备一中字体(在电 ...
- 使用GD库做图片水印
png图片作为水印加到其他类型图片后,背景变黑色 原因: imagecopy函数拷贝时可以保留png图像的原透明信息,而imagecopymerge却不支持图片的本身的透明拷贝. 然后直接上代码: / ...
- php用GD库给图片添加水印
php用GD库给图片添加文字水印,整个代码比较简单,DEMO如下: <?php /*打开图片*/ //1.配置图片路径 $src = "aeroplane.jpg"; //2 ...
- php课程 8-32 如何使用gd库进行图片裁剪和缩放
php课程 8-32 如何使用gd库进行图片裁剪和缩放 一.总结 一句话总结:图片缩放到图片裁剪就是改变原图截取的位置以及截取的宽高. 1.电商网站那么多的图片,如果全部加载卡得慢的很,所以他们是怎么 ...
- php 简单的学习GD库绘制图片并传回给前端实现方式
1.基本的GD库绘制图片汇总 2.后台实现小案例 <?php // $img = imagecreatetruecolor(200,40); // var_dump($img); // 利用GD ...
- php 使用GD库压缩图片,添加文字图片水印
先上一个工具类,提供了压缩,添加文字.图片水印等方法: image.class.php <?php class Image { private $info; private $image; pu ...
随机推荐
- php中使用mysql_fetch_object向页面输出结果,总结!
public function selectResultByThird() { if ((!empty ($_REQUEST["bigname"])) && (!e ...
- 鸽笼原理的运用HDU1205
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1205 题目解析:开始没看清题,WA了一发,以为只要最大的次大的差2就是NO,后来仔细看过之后才发现,, ...
- mysql中SQL执行过程详解与用于预处理语句的SQL语法
mysql中SQL执行过程详解 客户端发送一条查询给服务器: 服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果.否则进入下一阶段. 服务器段进行SQL解析.预处理,在优化器生成对应的 ...
- MySQL常用命令总结3
id SMALLINT UNSIGNED [AUTO_INCREMENT] PRIMARY KEY, //把id定义为主键且自动排号,每张数据表只有一个主键,不能为NULL,确保记录唯一性 //省略a ...
- bzoj4010: [HNOI2015]菜肴制作【拓扑排序】
想到了一个分治方法,每一次尽量放小的那个,把它依赖的放在左边,不依赖的放在右边. TLE 80: #include <bits/stdc++.h> #define rep(i, a, b) ...
- hack:选择符前缀法,样式属性前缀法
选择符前缀法 <style> *html .test{width:100px;} /*only for IE6*/ *+html .test{width:100px;}/*for IE6 ...
- spring mvc自定义注解--登录时密码加密注解
1,定义注解名称接口 /** * 使用该注解不用再MD5转换了 * * @author adonis * */ @Target(ElementType.PARAMETER) @Retention(Re ...
- 10-instanceof
在Java中可以使用instanceof关键字判断一个对象到底是不是一个类的实例 package com.example; class A{ void tell1(){ System.out.prin ...
- Mysql 多列形成主键(复合主键 )
什么是数据表的复合主键 所谓的复合主键 就是指你表的主键含有一个以上的字段组成 比如 create table test ( name varchar(19), id number, ...
- loading.io一个可以直接生成loading gif图标的站点
官网是:http://loading.io/ 进去后,可以拖动左图大小,然后点右边的make gif就可以自动生成所选大小的gif图标了,生成后会弹出一个download窗,点download下载即可 ...