ホームページ >バックエンド開発 >PHPチュートリアル >imagick_PHP チュートリアルについて言わなければならないこと

imagick_PHP チュートリアルについて言わなければならないこと

WBOY
WBOYオリジナル
2016-07-13 10:29:10741ブラウズ

GD ライブラリは通常、PHP マッピングに使用されます。これは組み込みであり、サーバーに追加のプラグインをインストールする必要がないため、メインの機能であればより安心して使用できます。画像を処理するプログラムである場合、 GD は非効率であるだけでなく、機能が比較的弱く、また GD の creatfrom??? も大量のシステム リソースを消費するため、 GD の使用はお勧めできません。このため、最近 GD に変更したプロジェクトの 1 つが imagick に変更されましたが、変更後にいくつかの状況が発生したので、ここで共有したいと思います。

まず、ここでの状況について話させてください:

状況1: 画像操作クラスを書き換える必要がある

状況 2: imagick のマルチスレッドにより CPU 使用率が 100% に急増します

ちなみに、imagick を centos6.4 にインストールする方法は次のとおりです:

リーリー

次に、上記の 2 つの状況に対する解決策を提案します。

状況 1 の解決策は次のとおりです:

imagick_PHP チュートリアルについて言わなければならないこと 1 /** 2 Imagick圖像處理類 3 使用法: 4 //Imagick 物件の導入 5 if(!define('CLASS_IMAGICK')){require(Inc.'class_imagick.php');} 6 $Imagick=new class_imagick(); 7 $Imagick->open('a.gif'); 8 $Imagick->resize_to(100,100,'scale_fill'); 9 $Imagick->add_text('1024i.com',10,20); 10 $Imagick->add_watermark('1024i.gif',10,50); 11 $Imagick->save_to('x.gif'); 12 unset($Imagick); 13 /**/ 14 15 定義('CLASS_IMAGICK',TRUE); 16 クラス class_imagick{ 17 プライベート $image=null; 18 プライベート $type=null; 19 20 // 構造 21 パブリック 関数 __construct(){} 22 23 // 析構 24 public function __destruct(){ 25 if($this->画像!==null){$this->画像->destroy();} 26 } 27 28 // 載せ圖画像 29 パブリック 関数 open($path){ 30 if(!file_exists($path)){ 31 $this->image=null; 32 戻る ; 33 } 34 $this->image=new Imagick($path); 35 if($this->画像){ 36 $this->type=strto lower($this->image->getImageFormat()); 37 } 38 $this->画像->stripImage(); 39 戻る $this->画像; 40 } 41 42 /** 43 圖像裁切 44 /**/ 45 public function Crop($x=0,$y=0,$width=null,$height=null){ 46 if($width==null) $width=$this->image->getImageWidth()-$x; 47 if($height==null) $height=$this->image->getImageHeight()-$y; 48 if($幅94f326299af6b75ce4b26612682054d4type=='gif'){ 51 $image=$this->image; 52 $canvas=new Imagick(); 53 54 $images=$image->coalesceImages(); 55 foreach($images as $frame){ 56 $img=new Imagick(); 57 $img->readImageBlob($frame); 58 $img->cropImage($幅,$高さ,$x,$y); 59 60 $canvas->addImage($img); 61 $canvas->setImageDelay($img->getImageDelay()); 62 $canvas->setImagePage($width,$height,0,0); 63 } 64 65 $image->destroy(); 66 $this->image=$canvas; 67 }{ 68 $this->image->cropImage($width,$height,$x,$y); 69 } 70 } 71 72/** 73 画像サイズを変更する 74 パラメータ: 75 $width: 新しい幅 76 $height: 新しい高さ 77 $fit: サイズに合わせてください 78 'force': 画像を $width X $height に強制します 79 'scale': $width X $height 内で画像を比例的に拡大縮小します。結果は $width X $height と正確には等しくなりません 80 'scale_fill': $width 内で画像を比例的に拡大縮小します) 81 その他: スマート モード、画像をズームし、中心から $width X $height のサイズにトリミングします 82 注: 83 $fit='force','scale','scale_fill' の場合に完全な画像を出力します 84 $fit=画像の向きを使用する場合、指定された位置に画像を出力します。 85 文字と画像の対応関係は以下の通りです。 86 北西 北北東 87 西中東 88 南西南南東 89 /**/ 90 public functionsize_to($width=100,$height=100,$fit='center',$fill_color=array(255,255,255,0 )){ 91 スイッチ($fit){ 92 ケース '力': 93 if($this->type=='gif'){ 94 $image=$this->image; 95 $canvas=new Imagick(); 96 97 $images=$image->coalesceImages(); 98 foreach($images as $frame){ 99 $img=new Imagick(); 100 $img->readImageBlob($frame); 101 $img->サムネイル画像($幅,$高さ,false); 102 103 $canvas->addImage($img); 104 $canvas->setImageDelay($img->getImageDelay()); 105 } 106 $image->destroy(); 107 $this->image=$canvas; 108 }{ 109 $this->画像->サムネイル画像($幅,$高さ,false); 110 } 111 休憩; 112 ケース 'スケール': 113 if($this->type=='gif'){ 114 $image=$this->image; 115 $images=$image->coalesceImages(); 116 $canvas=new Imagick(); 117 foreach($images as $frame){ 118 $img=new Imagick(); 119 $img->readImageBlob($frame); 120 $img->サムネイル画像($幅,$高さ,true); 121 122 $canvas->addImage($img); 123 $canvas->setImageDelay($img->getImageDelay()); 124 }125 $image->destroy(); 126 $this->image=$canvas; 127 }{ 128 $this->画像->サムネイル画像($幅,$高さ,true); 129 } 130 休憩; 131 case 'scale_fill': 132 $size=$this->image->getImagePage(); 133 $src_width=$size['width']; 134 $src_height=$size['高さ']; 135 136 $x=0; 137 $y=0; 138 139 $dst_width=$width; 140 $dst_height=$height; 141 142 if($src_width*$height > $src_height*$width){ 143 $dst_height=intval($width*$src_height/$src_width); 144 $y=intval(($height-$dst_height)/2); 145 }{ 146 $dst_width=intval($height*$src_width/$src_height); 147 $x=intval(($width-$dst_width)/2); 148 } 149 150 $image=$this->image; 151 $canvas=new Imagick(); 152 153 $color='rgba('.$fill_color[0].','.$fill_color[1].','.$fill_color[2].','. $fill_color[3].')'; 154 if($this->type=='gif'){ 155 $images=$image->coalesceImages(); 156 foreach($images as $frame){ 157 $frame->サムネイル画像($幅,$高さ,true); 158 159 $draw=new ImagickDraw(); 160$ draw-> composite($frame-> getimagecompose()、$x$y$dst_width$dst_height$frame)) ; 161 162 $img=new Imagick(); 163 $img->newImage($width,$height,$color,'gif'); 164 $img->drawImage($draw); 165 166 $canvas->addImage($img); 167 $canvas->setImageDelay($img->getImageDelay()); 168 $canvas->setImagePage($width,$height,0,0); 169 } 170 }{ 171 $image->thumbnailImage($width,$height,true); 172 173 $draw=new ImagickDraw(); 174$ draw-> composite($image-> getimageCompose()、$x$y$dst_width$dst_height$ymage)) ; 175 176 $canvas->newImage($width,$height,$color,$this->get_type()); 177 $canvas->drawImage($draw); 178 $canvas->setImagePage($width,$height,0,0); 179 } 180 $image->destroy(); 181 $this->image=$canvas; 182 休憩; 183 デフォルト: 184 $size=$this->image->getImagePage(); 185 $src_width=$size['width']; 186 $src_height=$size['高さ']; 187 188 $crop_x=0; 189 $crop_y=0; 190 191 $crop_w=$src_width; 192 $crop_h=$src_height; 193 194 if($src_width*$height > $src_height*$width){ 195 $crop_w=intval($src_height*$width/$height); 196 }{ 197 $crop_h=intval($src_width*$height/$width); 198 }199 200 スイッチ($fit){ 201 ケース 'north_west': 202 $crop_x=0; 203 $crop_y=0; 204 休憩; 205 ケース「北」: 206 $crop_x=intval(($src_width-$crop_w)/2); 207 $crop_y=0; 208 休憩; 209 ケース '北東': 210 $crop_x=$src_width-$crop_w; 211 $crop_y=0; 212 休憩; 213 ケース '西': 214 $crop_x=0; 215 $crop_y=intval(($src_height-$crop_h)/2); 216 休憩; 217 ケース 'センター': 218 $crop_x=intval(($src_width-$crop_w)/2); 219 $crop_y=intval(($src_height-$crop_h)/2); 220 休憩; 221 ケース '東': 222 $crop_x=$src_width-$crop_w; 223 $crop_y=intval(($src_height-$crop_h)/2); 224 休憩; 225 ケース 'south_west': 226 $crop_x=0; 227 $crop_y=$src_height-$crop_h; 228 休憩; 229 ケース '南': 230 $crop_x=intval(($src_width-$crop_w)/2); 231 $crop_y=$src_height-$crop_h; 232 休憩; 233 ケース '南東': 234 $crop_x=$src_width-$crop_w; 235 $crop_y=$src_height-$crop_h; 236 休憩; 237 デフォルト: 238 $crop_x=intval(($src_width-$crop_w)/2); 239 $crop_y=intval(($src_height-$crop_h)/2); 240 }241 242 $image=$this->image; 243 $canvas=new Imagick(); 244 245 if($this->type=='gif'){ 246 $images=$image->coalesceImages(); 247 foreach($images as $frame){ 248 $img=new Imagick(); 249 $img->readImageBlob($frame); 250 $img->cropImage($crop_w,$crop_h,$crop_x,$crop_y); 251 $img->サムネイル画像($幅,$高さ,true); 252 253 $canvas->addImage($img); 254 $canvas->setImageDelay($img->getImageDelay()); 255 $canvas->setImagePage($width,$height,0,0); 256 } 257 }{ 258 $image->cropImage($crop_w,$crop_h,$crop_x,$crop_y); 259 $image->サムネイル画像($幅,$高さ,true); 260 $canvas->addImage($image); 261 $canvas->setImagePage($width,$height,0,0); 262 } 263 $image->destroy(); 264 $this->image=$canvas; 265 } 266 } 267 268 /** 269 追加圖片水印 270 參數: 271 $path:水印圖片(完整路徑を含む) 272 $x,$y:水印公認 273 /**/ 274 public function add_watermark($path,$x=0,$y=0){ 275 $watermark=new Imagick($path); 276 $draw=new ImagickDraw(); 277 $draw->composite($watermark->getImageCompose(),$x,$y,$watermark->getImageWidth(),$watermark- >getimageheight(),$ウォーターマーク); 278 279 if($this->type=='gif'){ 280 $image=$this->image; 281 $canvas=new Imagick(); 282 $images=$image->coalesceImages(); 283 foreach($image as $frame){ 284 $img=new Imagick(); 285 $img->readImageBlob($frame); 286 $img->drawImage($draw); 287 288 $canvas->addImage($img); 289 $canvas->setImageDelay($img->getImageDelay()); 290 } 291 $image->destroy(); 292 $this->image=$canvas; 293 }{ 294 $this->画像->drawImage($draw); 295 }296 } 297 298 /** 299 テキストの透かしを追加 300 パラメータ: 301 $text: 透かしテキスト 302 $x,$y: 透かし座標 303 /**/ 304 public function add_text($text,$x=0,$y=0,$angle=0,$style=array()){ 305 $draw=new ImagickDraw(); 306 if(isset($style['font'])) $draw->setFont($style['font']); 307 if(isset($style['font_size'])) $draw->setFontSize($style['font_size']); 308 if(isset($style['fill_color'])) $draw->setFillColor($style['fill_color']); 309 if(isset($style['under_color'])) $draw->setTextUnderColor($style['under_color']); 310 311 if($this->type=='gif'){ 312 foreach($this->画像as $frame){ 313 $frame->annotateImage($draw,$x,$y,$angle,$text); 314 } 315 }{ 316 $this->image->annotateImage($draw,$x,$y,$angle,$text); 317 } 318 } 319 320 /** 321 画像アーカイブ 322 パラメータ: 323 $path: アーカイブの場所と新しいファイル名 324 /**/ 325 public function save_to($path){ 326 $this->画像->stripImage(); 327 スイッチ($this->type){ 328 ケース 'gif': 329 $this->image->writeImages($path,true); 330 戻る ; 331 ケース 'jpg': 332 ケース 'jpeg': 333 $this->image->setImageCompressionQuality($_ENV['ImgQ']); 334 $this->画像->writeImage($path); 335 戻る ; 336 ケース 'png': 337 $flag = $this->image->getImageAlphaChannel(); 338 339 // PNG 背景が不透明な場合は圧縮します 340 if(imagick::ALPHACHANNEL_UNDEFINED == $flag または imagick::ALPHACHANNEL_DEACTIVATE == $flag){ 341 $this->image->setImageType(imagick::IMGTYPE_PALETTE); 342 $this->画像->writeImage($path); 343 }{ 344 $this->画像->writeImage($path); 345 }設定解除($flag); 346 戻る ; 347 デフォルト: 348 $this->画像->writeImage($path); 349 戻る ; 350 } 351 }352 353 // 画像を画面に直接出力します 354 public function Output($header=true){ 355 if($header) header('Content-type: '.$this->type); 356 echo $this->image->getImagesBlob(); 357 } 358 359 /** 360 サムネイルを作成する 361 $fitがtrueの場合、比率は維持され、$width X $height以内に縮小画像が生成されます 362 /**/ 363 public functionサムネイル($幅=100,$高さ=100,$fit=true){$this->image->thumbnailImage( $幅,$高さ,$フィット);} 364 365 /** 366 画像に枠線を追加する 367 $width: 左右の境界線の幅 368 $height: 上下の境界線の幅 369 $color: カラー 370 /**/ 371 public function border($width,$height,$color='rgb(220,220,220)'){ 372 $color=new ImagickPixel(); 373 $color->setColor($color); 374 $this->image->borderImage($color,$width,$height); 375 } 376 377 //画像の幅を取得する 378 public function get_width(){$size=$this->image->getImagePage();return $size['width'];} 379 380 //画像の高さを取得します 381 public function get_height(){$size=$this->image->getImagePage();return $size['height'];} 382 383 // 画像タイプを設定する 384 public function set_type($type='png'){$this->type=$type;$this->image->setImageFormat($タイプ);} 385 386 // 画像タイプを取得する 387 public function get_type(){return $this->type;} 388 389 public function Blur($radius,$sigma){$this->image->blurImage($radius,$sigma);} // ぼやけてます 390 public function gaussian_blur($radius,$sigma){$this->image->gaussianBlurImage($radius,$sigma) ;} // ガウスぼかし 391 public function_blur($radius,$sigma,$angle){$this->image->motionBlurImage($radius,$sigma $角度);} // モーション ブラー 392 public functionradial_blur($radius){$this->image->radialBlurImage($radius);} // 放射状ぼかし 393 public function add_noise($type=null){$this->image->addNoiseImage($type==null?imagick::NOISE_IMPULSE : $type);} // ノイズを追加します 394 public function level($black_point,$gamma,$white_point){$this->image->levelImage($black_point,$gamma) 、 $white_point);} // 調整色階 395 public function modulate($brightness,$saturation,$hue){$this->image->modulateImage($brightness,$saturation,$hue);} // 調整亮度,飽和度,色調 396 public function charcoal($radius,$sigma){$this->image->charcoalImage($radius,$sigma);} // 素描效果 397 public function oil_paint($radius){$this->image->oilPaintImage($radius);} // 油畫效果 398 public function flop(){$this->image->flopImage();} // 水平翻轉 399 public function flip(){$this->image->flipImage();} // 垂直翻轉 400 } View Code

狀況二的解決辦法如下:

首先用/usr/local/imagemagick/bin/convert -version指令查看一下輸出內容是否已經開啟了多線程,Features:的值為空說明是單線程,如果Features:的值是openMP說明是多線程.imagick的多線程模式有一個bug,他會導致多核心的cpu使用率瞬間飆升到100%.所以一定要使用它的單線程模式才行.

Version: ImageMagick 6.7.1-2 2014-05-29 Q16 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2011 ImageMagick Studio LLC
Features:    

 上邊是我配置正確時顯示的結果,如果沒有配置正確會顯示下邊的結果

Version: ImageMagick 6.7.1-2 2014-05-29 Q16 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2011 ImageMagick Studio LLC
Features: openMP

 第一種結果是單線程模式,第二種結果是多線程模式,因為imagick的多線程模式有bug,所以如果您剛開始是用多線程模式安裝的imagick那就必須要yum remove imagemagick將其卸載掉重新安裝才行.

經過重寫class,重裝imagick之後一切正常,而且處理圖像的效能比之以前有了大幅提升

 

 

 

 

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/778220.htmlTechArticlePHP建圖通常都用GD庫,因為是內置的不需要在服務器上額外安裝插件,所以用起來比較省心,但是如果你的程序主要的功能就是處理圖像,那麼就...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。