温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

PHP怎么实现图片裁切、生成缩略图以及添加水印

发布时间:2021-08-09 18:06:29 阅读:161 作者:chen 栏目:开发技术
PHP开发者专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

这篇文章主要介绍“PHP怎么实现图片裁切、生成缩略图以及添加水印”,在日常操作中,相信很多人在PHP怎么实现图片裁切、生成缩略图以及添加水印问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PHP怎么实现图片裁切、生成缩略图以及添加水印”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

本文实例讲解了PHP使用Imagick 裁切、生成缩略图、添加水印自动检测和处理,支持gif,分享给大家供大家参考,具体内容如下

调用方式:

include 'imagick.class.php';  
$image new lib_image_imagick();  
$image->open('a.gif');  
$image->resize_to(100100'scale_fill');  
$image->add_text('1024i.com'1020);  
$image->add_watermark('1024i.gif'1050);  
$image->save_to('x.gif');

imagick.class.php

<?php  
/* 
@版本日期: 版本日期: 2012年1月18日 
@著作权所有: 1024 intelligence ( <a href="http://www.1024i.com" target="_blank">http://www.1024i.com</a> ) 
获得使用本类库的许可, 您必须保留著作权声明信息. 
报告漏洞,意见或建议, 请联系 Lou Barnes(iua1024@gmail.com) 
*/  
 
class lib_image_imagick  
{  
private $image null;  
private $type null;  
// 构造函数  
public function __construct(){}  
 
// 析构函数  
public function __destruct()  
{  
if($this->image!==null$this->image->destroy();  
}  
// 载入图像  
public function open($path)  
{  
$this->image = new Imagick$path );  
if($this->image)  
{  
$this->type = strtolower($this->image->getImageFormat());  
}  
return $this->image;  
}  
 
public function crop($x=0$y=0$width=null$height=null)  
{  
if($width==null$width $this->image->getImageWidth()-$x;  
if($height==null$height $this->image->getImageHeight()-$y;  
if($width<=0 || $height<=0return;  
if($this->type=='gif')  
{  
$image $this->image;  
$canvas new Imagick();  
$images $image->coalesceImages();  
foreach($images as $frame){  
$img new Imagick();  
$img->readImageBlob($frame);  
$img->cropImage($width$height$x$y);  
$canvas->addImage$img );  
$canvas->setImageDelay$img->getImageDelay() );  
$canvas->setImagePage($width$height00);  
}  
$image->destroy();  
$this->image = $canvas;  
}  
else  
{  
$this->image->cropImage($width$height$x$y);  
}  
}  
/* 
* 更改图像大小 
$fit: 适应大小方式 
'force': 把图片强制变形成 $width X $height 大小 
'scale': 按比例在安全框 $width X $height 内缩放图片, 输出缩放后图像大小 不完全等于 $width X $height 
'scale_fill': 按比例在安全框 $width X $height 内缩放图片,安全框内没有像素的地方填充色, 使用此参数时可设置背景填充色 $bg_color = array(255,255,255)(红,绿,蓝, 透明度) 透明度(0不透明-127完全透明)) 
其它: 智能模能 缩放图像并载取图像的中间部分 $width X $height 像素大小 
$fit = 'force','scale','scale_fill' 时: 输出完整图像 
$fit = 图像方位值 时, 输出指定位置部分图像 
字母与图像的对应关系如下: 
north_west north north_east 
west center east 
south_west south south_east 
*/  
public function resize_to($width 100$height 100$fit 'center'$fill_color array(255,255,255,0) )  
{  
switch($fit)  
{  
case 'force':  
if($this->type=='gif')  
{  
$image $this->image;  
$canvas new Imagick();  
$images $image->coalesceImages();  
foreach($images as $frame){  
$img new Imagick();  
$img->readImageBlob($frame);  
$img->thumbnailImage$width$heightfalse );  
$canvas->addImage$img );  
$canvas->setImageDelay$img->getImageDelay() );  
}  
$image->destroy();  
$this->image = $canvas;  
}  
else  
{  
$this->image->thumbnailImage$width$heightfalse );  
}  
break;  
case 'scale':  
if($this->type=='gif')  
{  
$image $this->image;  
$images $image->coalesceImages();  
$canvas new Imagick();  
foreach($images as $frame){  
$img new Imagick();  
$img->readImageBlob($frame);  
$img->thumbnailImage$width$heighttrue );  
$canvas->addImage$img );  
$canvas->setImageDelay$img->getImageDelay() );  
}  
$image->destroy();  
$this->image = $canvas;  
}  
else  
{  
$this->image->thumbnailImage$width$heighttrue );  
}  
break;  
case 'scale_fill':  
$size $this->image->getImagePage();  
$src_width $size['width'];  
$src_height $size['height'];  
$x 0;  
$y 0;  
$dst_width $width;  
$dst_height $height;  
if($src_width*$height $src_height*$width)  
{  
$dst_height intval($width*$src_height/$src_width);  
$y intval( ($height-$dst_height)/2 );  
}  
else  
{  
$dst_width intval($height*$src_width/$src_height);  
$x intval( ($width-$dst_width)/2 );  
}  
$image $this->image;  
$canvas new Imagick();  
$color 'rgba('.$fill_color[0].','.$fill_color[1].','.$fill_color[2].','.$fill_color[3].')';  
if($this->type=='gif')  
{  
$images $image->coalesceImages();  
foreach($images as $frame)  
{  
$frame->thumbnailImage$width$heighttrue );  
$draw new ImagickDraw();  
$draw->composite($frame->getImageCompose(), $x$y$dst_width$dst_height$frame);  
$img new Imagick();  
$img->newImage($width$height$color'gif');  
$img->drawImage($draw);  
$canvas->addImage$img );  
$canvas->setImageDelay$img->getImageDelay() );  
$canvas->setImagePage($width$height00);  
}  
}  
else  
{  
$image->thumbnailImage$width$heighttrue );  
$draw new ImagickDraw();  
$draw->composite($image->getImageCompose(), $x$y$dst_width$dst_height$image);  
$canvas->newImage($width$height$color$this->get_type() );  
$canvas->drawImage($draw);  
$canvas->setImagePage($width$height00);  
}  
$image->destroy();  
$this->image = $canvas;  
break;  
default:  
$size $this->image->getImagePage();  
$src_width $size['width'];  
$src_height $size['height'];  
$crop_x 0;  
$crop_y 0;  
$crop_w $src_width;  
$crop_h $src_height;  
if($src_width*$height $src_height*$width)  
{  
$crop_w intval($src_height*$width/$height);  
}  
else  
{  
$crop_h intval($src_width*$height/$width);  
}  
switch($fit)  
{  
case 'north_west':  
$crop_x 0;  
$crop_y 0;  
break;  
case 'north':  
$crop_x intval( ($src_width-$crop_w)/2 );  
$crop_y 0;  
break;  
case 'north_east':  
$crop_x $src_width-$crop_w;  
$crop_y 0;  
break;  
case 'west':  
$crop_x 0;  
$crop_y intval( ($src_height-$crop_h)/2 );  
break;  
case 'center':  
$crop_x intval( ($src_width-$crop_w)/2 );  
$crop_y intval( ($src_height-$crop_h)/2 );  
break;  
case 'east':  
$crop_x $src_width-$crop_w;  
$crop_y intval( ($src_height-$crop_h)/2 );  
break;  
case 'south_west':  
$crop_x 0;  
$crop_y $src_height-$crop_h;  
break;  
case 'south':  
$crop_x intval( ($src_width-$crop_w)/2 );  
$crop_y $src_height-$crop_h;  
break;  
case 'south_east':  
$crop_x $src_width-$crop_w;  
$crop_y $src_height-$crop_h;  
break;  
default:  
$crop_x intval( ($src_width-$crop_w)/2 );  
$crop_y intval( ($src_height-$crop_h)/2 );  
}  
$image $this->image;  
$canvas new Imagick();  
if($this->type=='gif')  
{  
$images $image->coalesceImages();  
foreach($images as $frame){  
$img new Imagick();  
$img->readImageBlob($frame);  
$img->cropImage($crop_w$crop_h$crop_x$crop_y);  
$img->thumbnailImage$width$heighttrue );  
$canvas->addImage$img );  
$canvas->setImageDelay$img->getImageDelay() );  
$canvas->setImagePage($width$height00);  
}  
}  
else  
{  
$image->cropImage($crop_w$crop_h$crop_x$crop_y);  
$image->thumbnailImage$width$heighttrue );  
$canvas->addImage$image );  
$canvas->setImagePage($width$height00);  
}  
$image->destroy();  
$this->image = $canvas;  
}  
}  
 
// 添加水印图片  
public function add_watermark($path$x 0$y 0)  
{  
$watermark new Imagick($path);  
$draw new ImagickDraw();  
$draw->composite($watermark->getImageCompose(), $x$y$watermark->getImageWidth(), $watermark->getimageheight(), $watermark);  
if($this->type=='gif')  
{  
$image $this->image;  
$canvas new Imagick();  
$images $image->coalesceImages();  
foreach($image as $frame)  
{  
$img new Imagick();  
$img->readImageBlob($frame);  
$img->drawImage($draw);  
$canvas->addImage$img );  
$canvas->setImageDelay$img->getImageDelay() );  
}  
$image->destroy();  
$this->image = $canvas;  
}  
else  
{  
$this->image->drawImage($draw);  
}  
}  
 
// 添加水印文字  
public function add_text($text$x 0 , $y 0$angle=0$style=array())  
{  
$draw new ImagickDraw();  
if(isset($style['font'])) $draw->setFont($style['font']);  
if(isset($style['font_size'])) $draw->setFontSize($style['font_size']);  
if(isset($style['fill_color'])) $draw->setFillColor($style['fill_color']);  
if(isset($style['under_color'])) $draw->setTextUnderColor($style['under_color']);  
if($this->type=='gif')  
{  
foreach($this->image as $frame)  
{  
$frame->annotateImage($draw$x$y$angle$text);  
}  
}  
else  
{  
$this->image->annotateImage($draw$x$y$angle$text);  
}  
}  
 
// 保存到指定路径  
public function save_to$path )  
{  
if($this->type=='gif')  
{  
$this->image->writeImages($pathtrue);  
}  
else  
{  
$this->image->writeImage($path);  
}  
}  
// 输出图像  
public function output($header true)  
{  
if($headerheader('Content-type: '.$this->type);  
echo $this->image->getImagesBlob();  
}  
 
public function get_width()  
{  
$size $this->image->getImagePage();  
return $size['width'];  
}  
public function get_height()  
{  
$size $this->image->getImagePage();  
return $size['height'];  
}  
// 设置图像类型, 默认与源类型一致  
public function set_type$type='png' )  
{  
$this->type = $type;  
$this->image->setImageFormat$type );  
}  
// 获取源图像类型  
public function get_type()  
{  
return $this->type;  
}  
 
// 当前对象是否为图片  
public function is_image()  
{  
if$this->image )  
return true;  
else  
return false;  
}  
 
public function thumbnail($width 100$height 100$fit true){ $this->image->thumbnailImage$width$height$fit );} // 生成缩略图 $fit为真时将保持比例并在安全框 $width X $height 内生成缩略图片  
/* 
添加一个边框 
$width: 左右边框宽度 
$height: 上下边框宽度 
$color: 颜色: RGB 颜色 'rgb(255,0,0)' 或 16进制颜色 '#FF0000' 或颜色单词 'white'/'red'... 
*/  
public function border($width$height$color='rgb(220, 220, 220)')  
{  
$color=new ImagickPixel();  
$color->setColor($color);  
$this->image->borderImage($color$width$height);  
}  
public function blur($radius$sigma){$this->image->blurImage($radius$sigma);} // 模糊  
public function gaussian_blur($radius$sigma){$this->image->gaussianBlurImage($radius$sigma);} // 高斯模糊  
public function motion_blur($radius$sigma$angle){$this->image->motionBlurImage($radius$sigma$angle);} // 运动模糊  
public function radial_blur($radius){$this->image->radialBlurImage($radius);} // 径向模糊  
public function add_noise($type=null){$this->image->addNoiseImage($type==null?imagick::NOISE_IMPULSE:$type);} // 添加噪点  
public function level($black_point$gamma$white_point){$this->image->levelImage($black_point$gamma$white_point);} // 调整色阶  
public function modulate($brightness$saturation$hue){$this->image->modulateImage($brightness$saturation$hue);} // 调整亮度、饱和度、色调  
public function charcoal($radius$sigma){$this->image->charcoalImage($radius$sigma);} // 素描  
public function oil_paint($radius){$this->image->oilPaintImage($radius);} // 油画效果  
public function flop(){$this->image->flopImage();} // 水平翻转  
public function flip(){$this->image->flipImage();} // 垂直翻转  
}

到此,关于“PHP怎么实现图片裁切、生成缩略图以及添加水印”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

php
AI

开发者交流群×