<!--test.php文件内容-->

<?php
//包含这个类image.class.php
include "image.class.php";

$img = new Image("./images");
/*
echo $img->thumb("dx.jpg", 1000, 1000, "th1_")."<br>";
echo $img->thumb("dx.jpg", 800, 800, "th2_")."<br>";
echo $img->thumb("dx.jpg", 600, 600, "th3_")."<br>";
echo $img->thumb("dx.jpg", 400, 400, "th4_")."<br>";
echo $img->thumb("dx.jpg", 300, 300, "th5_")."<br>";
echo $img->thumb("dx.jpg", 200, 200, "th6_")."<br>";
echo $img->thumb("dx.jpg", 100, 100, "th7_")."<br>";
echo $img->thumb("dx.jpg", 50, 50, "th8_")."<br>";
*/
/*
echo $img->watermark("dx.jpg", "php.gif", 0, "wa0_")."<br>";
echo $img->watermark("dx.jpg", "php.gif", 1, "wa1_")."<br>";
echo $img->watermark("dx.jpg", "php.gif", 2, "wa2_")."<br>";
echo $img->watermark("dx.jpg", "php.gif", 3, "wa3_")."<br>";
echo $img->watermark("dx.jpg", "php.gif", 4, "wa4_")."<br>";
echo $img->watermark("dx.jpg", "php.gif", 5, "wa5_")."<br>";
echo $img->watermark("dx.jpg", "php.gif", 6, "wa6_")."<br>";
echo $img->watermark("dx.jpg", "php.gif", 7, "wa7_")."<br>";
echo $img->watermark("dx.jpg", "php.gif", 8, "wa8_")."<br>";
echo $img->watermark("dx.jpg", "php.gif", 9, "wa9_")."<br>";
*/

// 122 104 104 108
echo $img->cut("cx.png", 122, 104, 104, 108);

<!-- image.class.php内容-->

<?php
/**
file: image.class.php 类名为Image
图像处理类,可以完成对各种类型的图像进行缩放、加图片水印和剪裁的操作。
*/
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. Java图片工具类,完成图片的截取和任意缩放

    package com.common.util; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Renderin ...

  2. php之图片处理类缩略图加水印

    用到两个image系统函数 imagecopymerge — 拷贝并合并图像的一部分 imagecopyresampled — 重采样拷贝部分图像并调整大小 /* 如何知道图片的大小和类型 无法确认调 ...

  3. arcgis 加载png图片实现图片跟随地图缩放 和图片的动态播放

    效果图: 主要原理: png加载到地图上是不可能的, 图像本身是没有地理信息的. 这里采用一种办法, 在地图上创建一个图形图层, 图形图层放一个矩形,给这个矩形用一个图片填充符号填充. 关键技术点: ...

  4. 完美png图片添加水印类

    完美png图片添加水印类 被添加水印图片和水印图片都可以是png,保证透明无色背景,可调节透明度 <?phpclass Imgshuiyin{ /* 缩略图相关常量定义 */ const THU ...

  5. PHP实现图片的等比缩放和Logo水印功能示例

    文章来自于:脚本之家 文章链接:https://www.jb51.net/article/112909.htm 这篇文章主要介绍了PHP实现图片的等比缩放和Logo水印功能,结合实例形式分析了php图 ...

  6. java图片高质量缩放类

    import java.awt.Color;import java.awt.Graphics;import java.awt.Image;import java.awt.image.BufferedI ...

  7. android95 缩放加载大图片

    MainActivity: package com.itheima.loadimage; import android.os.Bundle; import android.app.Activity; ...

  8. 19_Android中图片处理原理篇,关于人脸识别网站,图片加载到内存,图片缩放,图片翻转倒置,网上撕衣服游戏案例编写

    1加载图片到内存 (1).数码相机照片特别是大于3m以上的,内存吃不消,会报OutOfMemoryError,若是想只显示原图片的1/8,可以通过BitmapFactory.Options来实现,具体 ...

  9. 用es6类封装的图片预加载技术!

    1.HTML <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...

随机推荐

  1. C#动态数组ArrayList

    在C#中,如果需要数组的长度和元素的个数随着程序的运行不断改变,就可以使用ArrayList类,该类是一个可以动态增减成员的数组. 一.ArrayList类的常用属性和方法 1. ArrayList类 ...

  2. idea 启动不了

    idea 更新了新版本.  破解步骤安排完了之后 ,  发现怎么也启动不了.  没有任何提示. 于是为了查看错误信息去idea的安装目录bin下用idea.bat脚本启动发现了如下错误: 在idea6 ...

  3. 【mac】【转发】Mac系统升级后,按大小写键没反应了,切换大小写的灯不亮了

    Mac系统升级后发现caps lock 锁定大小写的键,失灵了,居然可以用来切换输入法了,经过一排查后, 使用以下几种方法处理: 方式一:长按 caps lock 键,来切换大小写 方式二:caps ...

  4. python3中urllib库的request模块详解

    刚刚接触爬虫,基础的东西得时时回顾才行,这么全面的帖子无论如何也得厚着脸皮转过来啊! 原帖地址:https://www.2cto.com/kf/201801/714859.html 什么是 Urlli ...

  5. UVA - 1152 4 Values whose Sum is 0问题分解,二分查找

    题目:点击打开题目链接 思路:暴力循环显然会超时,根据紫书提示,采取问题分解的方法,分成A+B与C+D,然后采取二分查找,复杂度降为O(n2logn) AC代码: #include <bits/ ...

  6. HDU:2586-How far away

    How far away Time limit1000 ms Memory limit32768 kB Problem Description There are n houses in the vi ...

  7. 欧拉函数:HDU1787-GCD Again(欧拉函数的模板)

    GCD Again Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  8. MIP启发式算法:Variable Neighborhood Decomposition Search

    *本文记录和分享学习到的知识,算不上原创. *参考文献见链接. 本文主要简述和VND VNS RINS很相关的vairable neighborhood decomposition search. 目 ...

  9. 面试(手打手写,待更新loading...)

    1)JAVA基础面试 1,引用数据类型和基本数据类型的区别是什么? Byte 1 short 2 int 4 long 8 Boolean 1 char 2 float 4 double 8. 基本数 ...

  10. CodeForces 392C Yet Another Number Sequence 矩阵快速幂

    题意: \(F_n\)为斐波那契数列,\(F_1=1,F_2=2\). 给定一个\(k\),定义数列\(A_i=F_i \cdot i^k\). 求\(A_1+A_2+ \cdots + A_n\). ...