ホームページ >バックエンド開発 >PHPチュートリアル >画像処理アーティファクト ImageMagick および PHP imagick 拡張機能
ページの読み込み速度を向上させ、トラフィックを減らすために、Web サイト上の画像をスリム化する必要があります。私は多くのソリューションを検討し、最終的にこのソフトウェアを使用することに決めました。宝物を見つけました。効果はあまりにも簡単です。
ImageMagick の概要:
ImageMagick は、人気のある TIFF を含む、89 を超える基本形式の画像ファイルの読み取り、書き込み、処理に使用できる、強力で安定したオープンソースのツールセットおよび開発パッケージです。 JPEG、GIF、PNG、PDF、PhotoCD 形式。 ImageMagick を使用すると、Web アプリケーションのニーズに応じて画像を動的に生成したり、画像 (または画像のグループ) にサイズの変更、回転、鮮明化、減色、特殊効果の追加を行うこともできます。同じ形式で保存することも、画像の操作はコマンド ライン、または C/C++、Perl、Java、PHP、Python、または Ruby でプログラミングすることによって行うことができます。同時に、ImageMagick は SVG を部分的にサポートする高品質の 2D ツールキットを提供します。 ImageMagic の主な焦点は、パフォーマンス、バグの削減、安定した API と ABI の提供です。
ImageMagick は、画像を作成、編集、結合するために使用されるソフトウェアです。複数の形式のイメージを読み取り、変換、書き込みできます。画像の切り取り、色の置換、各種効果の適用、画像の回転、結合、文字、直線、多角形、楕円、曲線、画像に付随する拡大・回転。 ImageMagick はフリー ソフトウェアです。すべてのソース コードはオープンであり、自由に使用、コピー、変更、配布することができます。ほとんどのオペレーティング システムをサポートします。
ImageMagick コマンドの概要 、ジッター、近接、画像上に画像を描画、新しい画像を追加、サムネイルを生成など。
識別: 1 つ以上の画像ファイルの形式と特性を説明します。
mogrify: 指定されたサイズ、ぼかし、トリミング、ディザなどに従って画像を作成します。 Mogrify は、元の画像ファイルを書き換えて、別の画像ファイルに書き込みます。
モンタージュ: いくつかの個別のフィーチャー画像を作成します。境界線、構造、画像名などの要素を含む画像内の任意の装飾画像。
比較: さまざまな画像を算術的および視覚的に評価します*** 他の変換された画像。
ディスプレイ: X サーバー システムがある場合は、画像を順番に表示できます
アニメーション: X サーバーを使用してアニメーション画像を表示します
インポート: X サーバーまたは表示可能なウィンドウに画像ファイルを出力します。 単一のウィンドウ、画面全体、または画面の任意の長方形部分をキャプチャできます。
conjure: MSL (Magick Scripting Language) で書かれたスクリプトを解釈して実行します。
インストール:
sudo apt-get install imagemagick
一般的な使用例:
品質: 画像の品質が高くなるほど、占有するスペースが大きくなります。品質を適切に下げると、画像のサイズを大幅に縮小できます。一般的に品質が100から85に下がると、基本的には肉眼では違いが分かりにくいですが、サイズは大きく小さくなります。 imagemagick は、-quality を渡すことで設定されます。
プロフィール: 写真の説明情報を記録します。たとえば、カメラ情報 (絞り、カメラ モデル)、Photoshop メタデータ、カラー テーブル、その他の情報です。占有容量は数 KB から数百 KB まで、場合によってはそれ以上になる可能性があります。 ImageMagicK は 2 つの方法でこの情報を削除できます。 +profile “*” または -strip
Exif 情報は、撮影プロセス中にデジタル カメラによって収集される一連の情報です。この情報は、よく知られている jpg ファイルのヘッダーに配置されます。つまり、Exif 情報が埋め込まれています。 JPEG画像ファイル形式の撮影パラメータのセット。主に、絞り、シャッター、ISO、日付と時刻、およびその時の撮影条件、カメラのブランドモデル、カラーコーディング、撮影中に録音されたサウンドに関連するその他の情報が含まれます。全地球測位システム (GPS) ) およびその他の情報。簡単に言えば、コンデジの日付印刷機能と似ていますが、Exif 情報によって記録される情報がより詳細かつ完全である点が異なります。ただし、Exif情報付きのJPEG画像ファイルは、通常のJPEGファイルよりも若干サイズが大きくなります。また、PSなどのソフトで加工した画像には「プログラムコメント」が付きます。プロの写真 Web サイトではない場合、この情報は役に立たないので削除できます:convert +profile “*” -strip src.jpg src-profile.jpg
convert -quality 85 src.jpg src-quality85.jpg
上記 2 つのコマンドは次のとおりです。組み合わせて使用:
find /tmp/images -iname "*.jpg" -exec convert -strip +profile "*" -quality 80 {} {} \;
PNG也可以通过减少PNG图片color数量的办法达到压缩的目的。但是这种办法压缩出来的图像可以明显看出来失真,而且呈锯齿状。
对于真实世界的PNG图片(通常指照片),一般先转换成JPG,再通过上面的办法来压缩。
convert -format jpg input.png input.jpg
convert -resize "500x300>" input.jpg output.jpg #如果图片比500x300小就保持原样,以防小图片被放大失真。
安装:
1.安装imgick扩展
1) sudo apt-get install libmagick-dev2) sudo apt-get install php-pear php5-dev3) sudo pecl install imagick2.编辑php.ini文件,使其加载
打开php.ini文件,在其中加入extension=imagick.so
/etc/php5/apache2/php.ini重启apache服务使其失效
/etc/init.d/apache2 restart
$thumb = new Imagick();$thumb->readImage('test.gif');$thumb->writeImage('test.jpg');$thumb->clear();$thumb->destroy();
Imgick Class API:http://php.net/manual/en/class.imagick.php
图片压缩心得:http://blog.lizhigang.net/archives/228
ImageMagick官网:http://www.imagemagick.org/script/index.php
http://elf8848.iteye.com/blog/382528
使用实例:http://hi.baidu.com/7soon/item/d394c2b55bd3bb70254b09ed
最后,附上我自己编写的PHP用Imgick处理图片的类:
/* * 图片压缩类 重新封装了Imagick * * @version 2014-07-30 * @author andy1219111@163.com */class Imgick_tool{ //Imagick对象实例 public $obj = null; public function __construct() { //判断是否加载了该扩展 if(!extension_loaded('Imagick')) { return false; } $this->obj = new Imagick(); } /* * png2jpg转换图片格式 * * @param string src_img 源图片路径 * @param string dest_img 要生成的图片的路径 * @return boolean 转换成共返回true 否则false */ public function png2jpg($src_img,$dest_img) { if(!is_object($this->obj)) { return false; } try { $this->obj->readImage($src_img); if($this->obj->writeImage($dest_img)) { $this->destory(); return $dest_img; } return false; } catch (ImagickException $e) { return false; } } /* * 去掉图片的profile信息 * * @param string src_img 源图片路径 * @return string src_img 图片名称 否则返回false */ public function strip_profile($src_img,$dest_img = '') { if(!is_object($this->obj)) { return false; } try { $dest_img = empty($dest_img) ? $src_img : $dest_img; $this->obj->readImage($src_img); $this->obj->stripImage (); if($this->obj->writeImage ($dest_img)) { $this->destory(); return $src_img; } return false; } catch (ImagickException $e) { return false; } } /* * 设置jpg图片质量 * * @param string src_img 源图片路径 * @param string dest_img 要生成的图片的路径 * @return boolean 转换成共返回true 否则false */ public function set_quality($src_img,$quality = 70,$dest_img = '') { if(!is_object($this->obj)) { return false; } try { $dest_img = empty($dest_img) ? $src_img : $dest_img; $this->obj->readImage($src_img); $this->obj->setImageCompression(Imagick::COMPRESSION_JPEG); $this->obj->setImageCompressionQuality($quality); if($this->obj->writeImage($dest_img)) { $this->destory(); return $dest_img; } return false; } catch (ImagickException $e) { return false; } } /* * 图片瘦身 * * @param string src_img 源图片路径 * @param int quality 设置图片压缩质量 * @param string dest_img 要生成的图片的路径 * @return boolean 转换成共返回true 否则false */ public function slimming($src_img,$quality = 60,$dest_img = '',) { if(!is_object($this->obj)) { return false; } try { $dest_img = empty($dest_img) ? $src_img : $dest_img; $this->obj->readImage($src_img); $this->obj->setImageFormat('jpeg'); $this->obj->setImageCompression(Imagick::COMPRESSION_JPEG); //将图片的质量降低到原来的60% $quality = $this->obj->getImageCompressionQuality() * $quality / 100; $this->obj->setImageCompressionQuality($quality); $this->obj->stripImage(); if($this->obj->writeImage($dest_img)) { $this->destory(); return $dest_img; } return false; } catch (ImagickException $e) { return false; } } /* * 生成缩略图 * * @param string src_img 源图片路径 * @param int quality 设置图片压缩质量 * @param string dest_img 要生成的图片的路径 * @return boolean 转换成共返回true 否则false */ public function thump($src_img,$width = 250,$height = '') { if(!is_object($this->obj)) { return false; } try { $file_info = pathinfo($src_img); //生成缩略图名称 $file_name = substr($file_info['basename'],0,strrpos($file_info['basename'],'.')); $dest_img = $file_info['dirname'] . '/' . $file_name . '_thump.' . $file_info['extension']; $this->obj->readImage($src_img); //计算要获得缩略图的高度 $img_width = $this->obj->>getImageWidth(); $img_height = $this->obj->>getImageHeight(); $dest_height = $img_height * ($width / $img_width); $this->obj->resizeImage($width, $dest_height, Imagick::FILTER_CATROM, 1, false); //生成图片 if($this->obj->writeImage($dest_img)) { $this->destory(); return $dest_img; } return false; } catch (ImagickException $e) { return false; } } /* * 释放资源 * */ function destory() { if(is_object($this->obj)) { $this->obj->clear(); $this->obj->destroy(); } } }