search
HomeBackend DevelopmentPHP TutorialPHP Imagick perfectly realizes picture cropping, generating thumbnails and adding watermarks

This article explains the example of PHP using Imagick to crop, generate thumbnails, add watermarks, automatic detection and processing, supports gif, and shares it with everyone for your reference. The specific content is as follows

Calling method:

include 'imagick.class.php';  
$image = new lib_image_imagick();  
$image->open('a.gif');  
$image->resize_to(100, 100, 'scale_fill');  
$image->add_text('1024i.com', 10, 20);  
$image->add_watermark('1024i.gif', 10, 50);  
$image->save_to('x.gif'); 

imagick.class. php

http://www.1024i.com ) 
获得使用本类库的许可, 您必须保留著作权声明信息. 
报告漏洞,意见或建议, 请联系 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($widthtype=='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, $height, 0, 0);  
}  
$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, $height, false );  
$canvas->addImage( $img );  
$canvas->setImageDelay( $img->getImageDelay() );  
}  
$image->destroy();  
$this->image = $canvas;  
}  
else  
{  
$this->image->thumbnailImage( $width, $height, false );  
}  
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, $height, true );  
$canvas->addImage( $img );  
$canvas->setImageDelay( $img->getImageDelay() );  
}  
$image->destroy();  
$this->image = $canvas;  
}  
else  
{  
$this->image->thumbnailImage( $width, $height, true );  
}  
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, $height, true );  
$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, $height, 0, 0);  
}  
}  
else  
{  
$image->thumbnailImage( $width, $height, true );  
$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, $height, 0, 0);  
}  
$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, $height, true );  
$canvas->addImage( $img );  
$canvas->setImageDelay( $img->getImageDelay() );  
$canvas->setImagePage($width, $height, 0, 0);  
}  
}  
else  
{  
$image->cropImage($crop_w, $crop_h, $crop_x, $crop_y);  
$image->thumbnailImage( $width, $height, true );  
$canvas->addImage( $image );  
$canvas->setImagePage($width, $height, 0, 0);  
}  
$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($path, true);  
}  
else  
{  
$this->image->writeImage($path);  
}  
}  
// 输出图像  
public function output($header = true)  
{  
if($header) header('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();} // 垂直翻转  
} 

I hope this article will be helpful to everyone learning php programming.

The above has introduced how PHP Imagick can perfectly realize image cropping, thumbnail generation, and watermarking, including other aspects. I hope it will be helpful to friends who are interested in PHP tutorials.

Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
How to make PHP applications fasterHow to make PHP applications fasterMay 12, 2025 am 12:12 AM

TomakePHPapplicationsfaster,followthesesteps:1)UseOpcodeCachinglikeOPcachetostoreprecompiledscriptbytecode.2)MinimizeDatabaseQueriesbyusingquerycachingandefficientindexing.3)LeveragePHP7 Featuresforbettercodeefficiency.4)ImplementCachingStrategiessuc

PHP Performance Optimization Checklist: Improve Speed NowPHP Performance Optimization Checklist: Improve Speed NowMay 12, 2025 am 12:07 AM

ToimprovePHPapplicationspeed,followthesesteps:1)EnableopcodecachingwithAPCutoreducescriptexecutiontime.2)ImplementdatabasequerycachingusingPDOtominimizedatabasehits.3)UseHTTP/2tomultiplexrequestsandreduceconnectionoverhead.4)Limitsessionusagebyclosin

PHP Dependency Injection: Improve Code TestabilityPHP Dependency Injection: Improve Code TestabilityMay 12, 2025 am 12:03 AM

Dependency injection (DI) significantly improves the testability of PHP code by explicitly transitive dependencies. 1) DI decoupling classes and specific implementations make testing and maintenance more flexible. 2) Among the three types, the constructor injects explicit expression dependencies to keep the state consistent. 3) Use DI containers to manage complex dependencies to improve code quality and development efficiency.

PHP Performance Optimization: Database Query OptimizationPHP Performance Optimization: Database Query OptimizationMay 12, 2025 am 12:02 AM

DatabasequeryoptimizationinPHPinvolvesseveralstrategiestoenhanceperformance.1)Selectonlynecessarycolumnstoreducedatatransfer.2)Useindexingtospeedupdataretrieval.3)Implementquerycachingtostoreresultsoffrequentqueries.4)Utilizepreparedstatementsforeffi

Simple Guide: Sending Email with PHP ScriptSimple Guide: Sending Email with PHP ScriptMay 12, 2025 am 12:02 AM

PHPisusedforsendingemailsduetoitsbuilt-inmail()functionandsupportivelibrarieslikePHPMailerandSwiftMailer.1)Usethemail()functionforbasicemails,butithaslimitations.2)EmployPHPMailerforadvancedfeatureslikeHTMLemailsandattachments.3)Improvedeliverability

PHP Performance: Identifying and Fixing BottlenecksPHP Performance: Identifying and Fixing BottlenecksMay 11, 2025 am 12:13 AM

PHP performance bottlenecks can be solved through the following steps: 1) Use Xdebug or Blackfire for performance analysis to find out the problem; 2) Optimize database queries and use caches, such as APCu; 3) Use efficient functions such as array_filter to optimize array operations; 4) Configure OPcache for bytecode cache; 5) Optimize the front-end, such as reducing HTTP requests and optimizing pictures; 6) Continuously monitor and optimize performance. Through these methods, the performance of PHP applications can be significantly improved.

Dependency Injection for PHP: a quick summaryDependency Injection for PHP: a quick summaryMay 11, 2025 am 12:09 AM

DependencyInjection(DI)inPHPisadesignpatternthatmanagesandreducesclassdependencies,enhancingcodemodularity,testability,andmaintainability.Itallowspassingdependencieslikedatabaseconnectionstoclassesasparameters,facilitatingeasiertestingandscalability.

Increase PHP Performance: Caching Strategies & TechniquesIncrease PHP Performance: Caching Strategies & TechniquesMay 11, 2025 am 12:08 AM

CachingimprovesPHPperformancebystoringresultsofcomputationsorqueriesforquickretrieval,reducingserverloadandenhancingresponsetimes.Effectivestrategiesinclude:1)Opcodecaching,whichstorescompiledPHPscriptsinmemorytoskipcompilation;2)DatacachingusingMemc

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

SublimeText3 Linux new version

SublimeText3 Linux new version

SublimeText3 Linux latest version

WebStorm Mac version

WebStorm Mac version

Useful JavaScript development tools