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

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($幅$高さreturn; 49 50 if($this->type=='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 までご連絡ください。
アクション中のPHP:実際の例とアプリケーションアクション中のPHP:実際の例とアプリケーションApr 14, 2025 am 12:19 AM

PHPは、電子商取引、コンテンツ管理システム、API開発で広く使用されています。 1)eコマース:ショッピングカート機能と支払い処理に使用。 2)コンテンツ管理システム:動的コンテンツの生成とユーザー管理に使用されます。 3)API開発:RESTFUL API開発とAPIセキュリティに使用されます。パフォーマンスの最適化とベストプラクティスを通じて、PHPアプリケーションの効率と保守性が向上します。

PHP:インタラクティブなWebコンテンツを簡単に作成しますPHP:インタラクティブなWebコンテンツを簡単に作成しますApr 14, 2025 am 12:15 AM

PHPにより、インタラクティブなWebコンテンツを簡単に作成できます。 1)HTMLを埋め込んでコンテンツを動的に生成し、ユーザー入力またはデータベースデータに基づいてリアルタイムで表示します。 2)プロセスフォームの提出と動的出力を生成して、XSSを防ぐためにHTMLSPECIALCHARSを使用していることを確認します。 3)MySQLを使用してユーザー登録システムを作成し、Password_HashおよびPreprocessingステートメントを使用してセキュリティを強化します。これらの手法を習得すると、Web開発の効率が向上します。

PHPとPython:2つの一般的なプログラミング言語を比較しますPHPとPython:2つの一般的なプログラミング言語を比較しますApr 14, 2025 am 12:13 AM

PHPとPythonにはそれぞれ独自の利点があり、プロジェクトの要件に従って選択します。 1.PHPは、特にWebサイトの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンス、機械学習、人工知能に適しており、簡潔な構文を備えており、初心者に適しています。

PHPの永続的な関連性:それはまだ生きていますか?PHPの永続的な関連性:それはまだ生きていますか?Apr 14, 2025 am 12:12 AM

PHPは依然として動的であり、現代のプログラミングの分野で重要な位置を占めています。 1)PHPのシンプルさと強力なコミュニティサポートにより、Web開発で広く使用されています。 2)その柔軟性と安定性により、Webフォーム、データベース操作、ファイル処理の処理において顕著になります。 3)PHPは、初心者や経験豊富な開発者に適した、常に進化し、最適化しています。

PHPの現在のステータス:Web開発動向を見てくださいPHPの現在のステータス:Web開発動向を見てくださいApr 13, 2025 am 12:20 AM

PHPは、現代のWeb開発、特にコンテンツ管理とeコマースプラットフォームで依然として重要です。 1)PHPには、LaravelやSymfonyなどの豊富なエコシステムと強力なフレームワークサポートがあります。 2)パフォーマンスの最適化は、Opcacheとnginxを通じて達成できます。 3)PHP8.0は、パフォーマンスを改善するためにJITコンパイラを導入します。 4)クラウドネイティブアプリケーションは、DockerおよびKubernetesを介して展開され、柔軟性とスケーラビリティを向上させます。

PHP対その他の言語:比較PHP対その他の言語:比較Apr 13, 2025 am 12:19 AM

PHPは、特に迅速な開発や動的なコンテンツの処理に適していますが、データサイエンスとエンタープライズレベルのアプリケーションには良くありません。 Pythonと比較して、PHPはWeb開発においてより多くの利点がありますが、データサイエンスの分野ではPythonほど良くありません。 Javaと比較して、PHPはエンタープライズレベルのアプリケーションでより悪化しますが、Web開発により柔軟性があります。 JavaScriptと比較して、PHPはバックエンド開発により簡潔ですが、フロントエンド開発のJavaScriptほど良くありません。

PHP対Python:コア機能と機能PHP対Python:コア機能と機能Apr 13, 2025 am 12:16 AM

PHPとPythonにはそれぞれ独自の利点があり、さまざまなシナリオに適しています。 1.PHPはWeb開発に適しており、組み込みのWebサーバーとRich Functionライブラリを提供します。 2。Pythonは、簡潔な構文と強力な標準ライブラリを備えたデータサイエンスと機械学習に適しています。選択するときは、プロジェクトの要件に基づいて決定する必要があります。

PHP:Web開発の重要な言語PHP:Web開発の重要な言語Apr 13, 2025 am 12:08 AM

PHPは、サーバー側で広く使用されているスクリプト言語で、特にWeb開発に適しています。 1.PHPは、HTMLを埋め込み、HTTP要求と応答を処理し、さまざまなデータベースをサポートできます。 2.PHPは、ダイナミックWebコンテンツ、プロセスフォームデータ、アクセスデータベースなどを生成するために使用され、強力なコミュニティサポートとオープンソースリソースを備えています。 3。PHPは解釈された言語であり、実行プロセスには語彙分析、文法分析、編集、実行が含まれます。 4.PHPは、ユーザー登録システムなどの高度なアプリケーションについてMySQLと組み合わせることができます。 5。PHPをデバッグするときは、error_reporting()やvar_dump()などの関数を使用できます。 6. PHPコードを最適化して、キャッシュメカニズムを使用し、データベースクエリを最適化し、組み込み関数を使用します。 7

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境