class Image {
private $path;
//Construction method is used to initialize the location of the picture
function __construct($path="./"){
$this->path=rtrim($path, "/")."/";
}
/* A shrinking of the picture
*
* Parameter $name: is the name of the image that needs to be processed
* Parameter $width: is the width after scaling
* Parameter $height: is the scaled height
* Parameter $qz: is the name prefix of the new picture
* Return value: It is the name of the zoomed image, if it fails, it returns false
*
*/
function thumb($name, $width, $height, $qz="th_"){
//Get picture information
$imgInfo=$this->getInfo($name); //Width, height, type of image
//Get image resources, resources can be created for various types of pictures jpg, gif, png
$srcImg=$this->getImg($name, $imgInfo);
//Get the size of the image after calculating the equal proportions, $size["width"], $size["height"]
$size=$this->getNewSize($name, $width, $height, $imgInfo);
//Get new image resources and process the gif transparent background
$newImg=$this->kidOfImage($srcImg, $size, $imgInfo);
//Save as a new image and return the new scaled image name
return $this->createNewImage($newImg, $qz.$name, $imgInfo);
}
private function createNewImage($newImg, $newName, $imgInfo){
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
$return=imagepng($newImg, $this->path.$newName);
break;
imagedestroy($newImg);
return $newName;
}
private function kidOfImage($srcImg, $size, $imgInfo){
$newImg=imagecreatetruecolor($size["width"], $size["height"]);
$otsc=imagecolortransparent($srcImg);
if($otsc >=0 && $otsc <= imagecolorstotal($srcImg)){
$tran=imagecolorsforindex($srcImg, $otsc);
$newt=imagecolorallocate($newImg, $tran["red"], $tran["green"], $tran["blue"]);
imagefill($newImg, 0, 0, $newt);
imagecolortransparent($newImg, $newt);
}
imagecopyresized($newImg, $srcImg, 0, 0, 0, 0, $size["width"], $size["height"], $imgInfo["width"], $imgInfo["height"]);
imagedestroy($srcImg);
return $newImg;
}
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 getInfo($name){
$data=getImageSize($this->path.$name);
$imageInfo["width"]=$data[0];
$imageInfo["height"]=$data[1];
$imageInfo["type"]=$data[2];
return $imageInfo;
}
private function getImg($name, $imgInfo){
$srcPic=$this->path.$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;
}
return $img;
}
/* 功能:为图片加水印图片
* 参数$groundName: 背景图片,即需要加水印的图片
* 参数$waterName: 水钱图片
* 参数#aterPost:水印位置, 10种状态,
* 0为随机位置
*
* 1. 为顶端居左 2. 为顶端居中 3 为顶端居右
* 4 为中部居左 5. 为中部居中 6 为中部居右
* 7 . 为底端居左 8. 为底端居中, 9. 为底端居右
*
* 参数$qz : 是加水印后的图片名称前缀
* 返回值:就是处理后图片的名称
*
*/
function waterMark($groundName, $waterName, $waterPos=0, $qz="wa_"){
if(file_exists($this->path.$groundName) && file_exists($this->path.$waterName)){
$groundInfo=$this->getInfo($groundName);
$waterInfo=$this->getInfo($waterName);
//水印的位置
if(!$pos=$this->position($groundInfo, $waterInfo, $waterPos)){
echo "水印不应该比背景图片小!";
return;
}
$groundImg=$this->getImg($groundName, $groundInfo);
$waterImg=$this->getImg($waterName, $waterInfo);
$groundImg=$this->copyImage($groundImg, $waterImg, $pos, $waterInfo);
return $this->createNewImage($groundImg, $qz.$groundName, $groundInfo);
}else{
echo "图片或水印图片不存在";
return false;
}
}
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 position($groundInfo, $waterInfo, $waterPos){
//需要背景比水印图片大
if(($groundInfo["width"]< $waterInfo["width"]) ||($groundInfo["height"] < $waterInfo["height"])){
return false;
}
switch($waterPos){
case 1:
$posX=0;
$posY=0;
break;
case 2:
$posX=($groundInfo["width"]-$waterInfo["width"])/2;
$posY=0;
break;
case 3:
$posX=$groundInfo["width"]-$waterInfo["width"];
$posY=0;
break;
case 4:
$posX=0;
$posY=($groundInfo["height"]-$waterInfo["height"]) /2;
break;
case 5:
$posX=($groundInfo["width"]-$waterInfo["width"])/2;
$posY=($groundInfo["height"]-$waterInfo["height"]) /2;
break;
case 6:
$posX=$groundInfo["width"]-$waterInfo["width"];
$posY=($groundInfo["height"]-$waterInfo["height"]) /2;
break;
case 7:
$posX=0;
$posY=$groundInfo["height"]-$waterInfo["height"];
break;
case 8:
$posX=($groundInfo["width"]-$waterInfo["width"])/2;
$posY=$groundInfo["height"]-$waterInfo["height"];
break;
case 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);
}
}
class Image {
private $path;
//构造方法用来对图片所在位置进行初使化
function __construct($path="./"){
$this->path=rtrim($path, "/")."/";
}
/* 对图片进行缩放
*
* Parameter $name: is the name of the image that needs to be processed
* Parameter $width: is the width after scaling
* Parameter $height: is the scaled height
* Parameter $qz: is the name prefix of the new picture
* Return value: It is the name of the zoomed image. If it fails, it returns false
*
*/
function thumb($name, $width, $height, $qz="th_"){
//Get picture information
$imgInfo=$this->getInfo($name); //Width, height, type of image
//Get picture resources, you can create resources for various types of pictures jpg, gif, png
$srcImg=$this->getImg($name, $imgInfo);
//Get the size of the image after calculating the equal proportions, $size["width"], $size["height"]
$size=$this->getNewSize($name, $width, $height, $imgInfo);
//Get new image resources and process the gif transparent background
$newImg=$this->kidOfImage($srcImg, $size, $imgInfo);
//Save as a new picture and return the new scaled picture name
Return $this->createNewImage($newImg, $qz.$name, $imgInfo);
}
private function createNewImage($newImg, $newName, $imgInfo){
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
$return=imagepng($newImg, $this->path.$newName);
Break;
}
Imagedestroy($newImg);
Return $newName;
}
private function kidOfImage($srcImg, $size, $imgInfo){
$newImg=imagecreatetruecolor($size["width"], $size["height"]);
$otsc=imagecolortransparent($srcImg);
if($otsc >=0 && $otsc <= imagecolorstotal($srcImg)){
$tran=imagecolorsforindex($srcImg, $otsc);
$newt=imagecolorallocate($newImg, $tran["red"], $tran["green"], $tran["blue"]);
imagefill($newImg, 0, 0, $newt);
imagecolortransparent($newImg, $newt);
}
imagecopyresized($newImg, $srcImg, 0, 0, 0, 0, $size["width"], $size["height"], $imgInfo["width"], $imgInfo["height"] );
imagedestroy($srcImg);
return $newImg;
}
private function getNewSize($name, $width, $height, $imgInfo){
$size["width"]=$imgInfo["width"];
$size["height"]=$imgInfo["height"];
//If the zoomed width is smaller than the original image, reset the width
if($width < $imgInfo["width"]){
$size["width"]=$width;
}
//If the zoomed height is smaller than the original image, reset the height
if($height < $imgInfo["height"]){
$size["height"]=$height;
}
//Algorithm for image scaling
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 getInfo($name){
$data=getImageSize($this->path.$name);
$imageInfo["width"]=$data[0];
$imageInfo["height"]=$data[1];
$imageInfo["type"]=$data[2];
return $imageInfo;
}
private function getImg($name, $imgInfo){
$srcPic=$this->path.$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;
}
return $img;
}
/* Function: Add watermark to pictures
* Parameter $groundName: background image, that is, the image that needs to be watermarked
* Parameter $waterName: water money picture
* Parameter #aterPost: watermark position, 10 states,
* 0 is a random position
*
* 1. For top left 2. For top center 3 For top right
* 4 means the middle is on the left 5. means the middle is in the middle 6 means the middle is on the right
* 7. The bottom is on the left, 8. The bottom is in the middle, 9. The bottom is on the right
*
* Parameter $qz: is the watermarked image name prefix
* Return value: It is the name of the processed image
*
*/
function waterMark($groundName, $waterName, $waterPos=0, $qz="wa_"){
If(file_exists($this->path.$groundName) && file_exists($this->path.$waterName)){
$groundInfo=$this->getInfo($groundName);
$waterInfo=$this->getInfo($waterName);
//Position of watermark
If(!$pos=$this->position($groundInfo, $waterInfo, $waterPos)){
echo "The watermark should not be smaller than the background image!";
Return;
}
$groundImg=$this->getImg($groundName, $groundInfo);
$waterImg=$this->getImg($waterName, $waterInfo);
$groundImg=$this->copyImage($groundImg, $waterImg, $pos, $waterInfo);
return $this->createNewImage($groundImg, $qz.$groundName, $groundInfo);
}else{
echo "The picture or watermark image does not exist";
Return false;
}
}
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 position($groundInfo, $waterInfo, $waterPos){
//The background needs to be larger than the watermark image
if(($groundInfo["width"]< $waterInfo["width"]) ||($groundInfo["height"] < $waterInfo["height"])){
Return false;
}
switch($waterPos){
case 1:
$posX=0;
$posY=0;
break;
case 2:
$posX=($groundInfo["width"]-$waterInfo["width"])/2;
$posY=0;
break;
case 3:
$posX=$groundInfo["width"]-$waterInfo["width"];
$posY=0;
break;
case 4:
$posX=0;
$posY=($groundInfo["height"]-$waterInfo["height"]) /2;
break;
case 5:
$posX=($groundInfo["width"]-$waterInfo["width"])/2;
$posY=($groundInfo["height"]-$waterInfo["height"]) /2;
break;
case 6:
$posX=$groundInfo["width"]-$waterInfo["width"];
$posY=($groundInfo["height"]-$waterInfo["height"]) /2;
break;
case 7:
$posX=0;
$posY=$groundInfo["height"]-$waterInfo["height"];
break;
case 8:
$posX=($groundInfo["width"]-$waterInfo["width"])/2;
$posY=$groundInfo["height"]-$waterInfo["height"];
break;
case 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);
}
}
摘自 chaojie2009的专栏