ホームページ >バックエンド開発 >PHPチュートリアル >imagick_PHP チュートリアルについて言わなければならないこと
GD ライブラリは通常、PHP マッピングに使用されます。これは組み込みであり、サーバーに追加のプラグインをインストールする必要がないため、メインの機能であればより安心して使用できます。画像を処理するプログラムである場合、 GD は非効率であるだけでなく、機能が比較的弱く、また GD の creatfrom??? も大量のシステム リソースを消費するため、 GD の使用はお勧めできません。このため、最近 GD に変更したプロジェクトの 1 つが imagick に変更されましたが、変更後にいくつかの状況が発生したので、ここで共有したいと思います。
まず、ここでの状況について話させてください:状況1: 画像操作クラスを書き換える必要がある
状況 2: imagick のマルチスレッドにより CPU 使用率が 100% に急増します
ちなみに、imagick を centos6.4 にインストールする方法は次のとおりです:
リーリー
次に、上記の 2 つの状況に対する解決策を提案します。
状況 1 の解決策は次のとおりです:
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%.所以一定要使用它的單線程模式才行. 上邊是我配置正確時顯示的結果,如果沒有配置正確會顯示下邊的結果 第一種結果是單線程模式,第二種結果是多線程模式,因為imagick的多線程模式有bug,所以如果您剛開始是用多線程模式安裝的imagick那就必須要yum remove imagemagick將其卸載掉重新安裝才行. 經過重寫class,重裝imagick之後一切正常,而且處理圖像的效能比之以前有了大幅提升 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