ImagicICK vs GD

Joseph Gordon-Levitt
Joseph Gordon-Levittオリジナル
2025-02-22 09:26:08899ブラウズ

Imagick vs GD

キーポイント

  • GDとImageMagickは、人気のあるPHP画像処理ライブラリであり、ImageMagickがより強力です。
  • パフォーマンスの観点から、2つの間に絶対的な利点と欠点はなく、速度は特定のアプリケーションシナリオに依存します。
  • エンコーディングスタイルは重要です。GDは手続き上のプログラミングを採用しています。
  • これら2つのライブラリに加えて、クラウドイメージ処理プラットフォームやアプリケーションに統合されたコンポーネントなど、他のオプションがあります。

はじめに

PHPアプリケーションでは、サムネイルを作成したり、画像フィルターを適用したり、他の画像変換を実行する必要がある場合は、画像処理ライブラリを使用する必要があります。通常、GDまたはImageMagickを選択します。しかし、どのライブラリがより多くの画像形式をサポートしていますか?どのライブラリがより速いですか?適切なライブラリを選択する際には、他にどのような要因を考慮する必要がありますか?この記事では、これらの質問に答えます!

可用性

GDとImageMagickは、PHP自体でインストールおよび構成されている場合、PHPで利用できます。 GDライブラリはデフォルトでPHP 4.3から始まるため、ほとんどのサーバー環境で使用できます。一方、ImageMagickは常に利用可能ではなく、一部のホスティング会社はそれを提供していません。

数行のコードを実行して、これら2つのライブラリの可用性を確認できます。 ImageMagickの

およびGDのqueryFormats()関数は、各ライブラリでサポートされている画像形式をリストすることもできます。 gd_info()

<code class="language-php">if (extension_loaded('gd')) {
    print_r(gd_info());
} else {
    echo 'GD不可用。';
}

if (extension_loaded('imagick')) {
    $imagick = new Imagick();
    print_r($imagick->queryFormats());
} else {
    echo 'ImageMagick不可用。';
}</code>
サポートされているファイルタイプ

上記のコードを実行した後に印刷されたサポートされている画像形式リストは、最初にImageMagickライブラリの関数がGDをはるかに超えていることを示しています。 GDはJPG、PNG、GIF、WBMP、WebP、XBM、XPMファイルのみをサポートしており、ImageMagickライブラリによって処理された100を超えるファイルタイプと比較して、数値は非常に限られています。

ImageMagickがサポートするこれらすべての珍しい形式を使用しないと思うかもしれませんが、そうではないかもしれません。私のプロジェクトの1つでは、GDがTIFFファイルをサポートしていないという理由だけで、GDからImageMagickに切り替える必要がありました。

function

GDとImageMagickはどちらも、画像のサイズ変更とトリミング、カスタムシェイプ、テキスト、その他の画像ファイルで構成される画像の作成、画像フィルターの適用(明るさ、コントラスト、シェーディングなど)などの基本的な機能を提供します。

より高度な画像を処理する場合は、ImageMagickライブラリのすべての機能をご覧ください。 ImageMagickの例(1番目と2番目のページ)に示すように、あなたは無数の方法で画像を変換、装飾、または歪曲することができます。

PHP ImageMagickクラス自体は331の方法を提供しますが、これはかなりかなりの数です(いいえ、手動でカウントしませんでした。一方では、ImageMagickライブラリのパワーを示しており、他方では、特定のユースケースに適切な方法を見つけて実装することも困難になります。

パフォーマンスReflectionClass

正直に言うと、サムネイルのセットを作成したり、画像に単純な変換を適用したい場合は、各画像処理ライブラリのパフォーマンスを比較することを気にする必要はありません。

典型的なサーバー構成で行った一連のテストで、3MBのデジタルカメラJPG画像からサムネイルを作成すると、ImageMagickを使用するのに約0.6秒、GDを使用するのに約0.5秒かかります。したがって、どのライブラリを使用しても、プロセス全体には時間がかかりません。 Webを閲覧し、両方のライブラリの速度テストを見つけた後、どちらもパフォーマンスの面で際立っていないことにすぐに気付くでしょう。 GDライブラリがより速く実行される場合があり、時にはImageMagickであることもあります - それはすべてユースケース次第です。 GDを使用するかImageMagickを使用するかを決定する際に、この標準を重要な要素として考慮しないでください。

コーディングスタイル

GDとImageMagickライブラリを使用して記述された同じ画像変換コードを比較すると、それらの間にいくつかの違いにすぐに気付くでしょう。 GDライブラリは、getimagesize()imagecreatetruecolor()などの一連の関数を通じて提供されるため、画像処理スクリプト全体を手続きスタイルで記述する必要があります。 jpg画像のサムネイルを作成する例を見てみましょう:

<code class="language-php">if (extension_loaded('gd')) {
    print_r(gd_info());
} else {
    echo 'GD不可用。';
}

if (extension_loaded('imagick')) {
    $imagick = new Imagick();
    print_r($imagick->queryFormats());
} else {
    echo 'ImageMagick不可用。';
}</code>

エラーが発生したときに例外がスローされていないため、各GD関数の結果をチェックすることですべてのエラー処理を達成する必要があります。また、imagecopyresampled()imagecopyresized()などの10のパラメーターを使用して、巨大な機能を扱う必要があります。私は、非常に多くのパラメーターが優れたコーディングプラクティスの例ではないと信じています。

それほど便利ではないかもしれないもう1つのことは、画像の読み取りと保存の機能が画像の種類によって異なることです。したがって、サムネイル生成スクリプトにさまざまなファイルタイプを処理する場合は、次のコードを追加する必要があります。

<code class="language-php">$src_img = imagecreatefromjpeg('source.jpg');
if (!$src_img) {
    die('读取源图像时出错。');
}
$thumbnail = imagecreatetruecolor(800, 800);
if (!$thumbnail) {
    die('创建目标图像时出错。');
}
$result = imagecopyresampled($thumbnail, $src_img, 0, 0, 0, 0, 800, 800, 1600, 1600);
if (!$result) {
    die('生成缩略图时出错。');
}
$result = imagejpeg($thumbnail, 'destination.jpg');
if (!$result) {
    die('保存缩略图时出错。');
}
$result = imagedestroy($thumbnail);
if (!$result) {
    die('销毁图像时出错。');
}</code>
次に、ターゲット画像を正しい形式で保存するには、画像タイプに従って異なる関数を実行する必要があります。ご覧のとおり、GDコードはすぐに複雑になります。

同じ操作を担当するImageMagickコードを確認するだけで、違いに気付くでしょう。

ImageMagickライブラリには、Imagicickクラスを介してアクセスできます。したがって、オブジェクト指向のプログラミングパラダイムのすべての利点から利益を得ることができます。最も簡単な例は、エラーに対処する方法です。 ImageMagickライブラリを使用する場合、すべてのコードをトライキャッチブロックにラップするだけで、アプリケーションが安全に実行できます。
<code class="language-php">switch ($image_type) {
    case 'gif':
        $src_img = imagecreatefromgif($path);
        break;
    case 'png':
        $src_img = imagecreatefrompng($path);
        break;
    case 'jpg':
    case 'jpeg':
        $src_img = imagecreatefromjpeg($path);
        break;
    default:
        return false;
        break;
}

//继续创建缩略图</code>
上記のように、サムネイルの作成を担当するImageMagickスクリプトには、ソース画像タイプに関連するコードは含まれていません。同じコードを使用して、PNGまたはTIFファイルと同様にJPG画像を処理できます。ソースイメージを別のタイプに変換する必要がある場合は、

メソッドを実行する前にコードの行を追加するだけです:

writeImage()はっきりしていますか?私の意見では、GDライブラリ関数を使用して画像を処理することは、ImageMagickほど便利ではありません。もちろん、GDにはオブジェクト指向にするためにいくつかのラッパーがありますが、この時点でパッチを適用するように感じ始めます。

<code class="language-php">try {
    $imagick = new Imagick();
    $imagick->readImage('source.jpg');
    $imagick->thumbnailImage(800, 800);
    $imagick->writeImage('destination.jpg');
} catch (Exception $e) {
    die('创建缩略图时出错:' . $e->getMessage());
}</code>

人気

GDライブラリはデフォルトですべての新しいPHPバージョンに含まれているため、このライブラリはImageMagickよりもさまざまなプロジェクトで頻繁に表示される場合があります。 CakePHPプロジェクトには、画像のアップロードとサムネイルの生成の処理を担当するコンポーネントが必要になったとき、ニーズに合ったGDに基づいたコンポーネントをすぐに見つけました。 Kohana Framework Image Libraryなど、2つの画像処理ライブラリから選択できるいくつかのよく書かれたモジュールを見つけることがありますが、それらは一般的ではないのではないかと心配しています。

代替

アプリケーションで画像処理を処理する方法を決定する際には、特定のPHPライブラリに固執する必要はありません。検討する価値のある他のソリューションがあります:

  1. PHPアプリケーションの外で実行されている画像処理スクリプトを使用します。私のアプリの1つでは、訪問者がブラウザウィンドウでオンラインで画像を変換できるようにするWebページを作成する必要があります。私はcaman.js javascript画像処理ライブラリを使用することにしましたが、素晴らしい仕事をしました。このライブラリは、node.jsプラットフォームに埋め込まれたバックグラウンドスクリプトとして使用することもできます。

  2. クラウドベースの画像処理プラットフォームを使用します。クラウドベースのソリューションはあなたのために仕事をすることができます - ソースファイルを送信した後、さまざまなサイズまたはさまざまなフィルターを介して変換された画像のサムネイルを取得できます。あまり多くのコードを書く必要はなく、サーバー機能に限定されていません。 Googleを開いて、そのようなサービスを提供する一部の会社を見つけるだけです。

  3. 使用しているコンポーネントの機能を確認します。すでにアプリに接続されているサービスを使用して画像を変換できることに驚くかもしれません。たとえば、Dropbox APIは、5つの利用可能なサイズのいずれかでJPGまたはPNG画像を取得できるサムネイルメソッドを提供します。ライブラリとAPIのドキュメントを確認すると、必要なことができることがわかります。

概要

ご覧のとおり、各画像処理ライブラリには利点と短所があります。 GDライブラリは広く利用可能であるため、どこでも動作する場合があります。非常に人気があるため、このライブラリを使用する多くの例やコンポーネントを簡単に見つけることができます。 ImageMagickよりも多くの人がGDライブラリに精通している可能性があるため、ヘルプを得ることも簡単です。

ImageMagickはより多くのファイルタイプをサポートし、GDライブラリよりも多くの方法で画像を変換できます。また、より明確で高品質のコードを書くこともできます。

最後に、クラウドイメージ処理サービスなど、他の選択肢があり、両方のライブラリの必要性を完全に排除する可能性があります。この記事があなたがあなたの選択をするのに役立つことを願っています。

この記事について質問やコメントがある場合は、以下にコメントするか、Googleからお問い合わせください。

Imagicとgd

のFAQ

機能の面でのImagicickとGDの主な違いは何ですか?

ImagicicとGDはどちらもPHPでの画像処理の強力なライブラリです。ただし、機能は大きく異なります。膨大な機能セットで知られるImagickは、レイヤーエフェクト、画像フィルター、カラー調整などの高度な機能など、さまざまな画像処理オプションを提供します。一方、GDはよりシンプルで簡単で、サイズ変更、トリミング、シンプルな描画機能などの基本的な画像処理タスクに焦点を当てています。 GDは簡単なタスクを達成するのに十分かもしれませんが、Imagicickは、より複雑な画像処理要件の最初の選択肢であることがよくあります。

イメージックとGDはパフォーマンスの観点からどのように比較されますか?

パフォーマンスは、タスクとサーバーの環境によって異なる場合があります。一般的に言えば、Imagickは、その広範な機能セットのため、GDよりも多くのリソースを消費すると考えられています。ただし、特に複雑な画像処理タスクを扱う場合は、高品質の結果も生成する傾向があります。一方、GDは通常、より速く、リソースが少なくなるため、リソースが限られているシンプルなタスクや環境に適しています。

イメージックまたはGDのどれが良いか、大きな画像を処理するのに適していますか?

Imagicickは通常、大きな画像を使用するのに適しています。これは、Imagicickが「ディスクベースのピクセルキャッシュ」と呼ばれる機能をサポートしているためです。これにより、使用可能なメモリよりも大きい画像を処理できます。一方、GDはこの機能をサポートしていないため、特にメモリが制限されているサーバーで、大きな画像を使用するときに困難が発生する可能性があります。

イメージックとGDは透明性をどのように処理しますか?

ImagicickとGDの両方が透明性をサポートしますが、透明度はわずかに異なります。 Imagicicは、アルファチャネルやさまざまなハイブリッドモードなど、より広範な透明性オプションをサポートしています。一方、GDは透明性に対するより限られたサポートがあり、複雑な透明性効果に対処することが困難な場合があります。

同じプロジェクトでImagickとGDを使用できますか?

はい、ImagickとGDは同じプロジェクトで同時に使用できます。ただし、これらの2つのライブラリは異なる構文名と関数名を使用していることに注意することが重要です。そのため、コードが両方と互換性があることを確認する必要があります。さらに、同じプロジェクトで両方のライブラリを使用すると、コードの複雑さが増し、パフォーマンスの問題が発生する可能性があるため、可能な場合はそのいずれかを選択することをお勧めします。

より広範なサポートを持っているライブラリ:ImagicickまたはGD?

ImagicicとGDの両方が広くサポートされ、積極的に維持されています。ただし、GDはほとんどのPHPインストールにデフォルトで含まれているため、より普遍的に利用可能になります。一方、イメージックは通常、個別にインストールする必要があります。これにより、互換性の問題を引き起こすことがあります。

ドキュメントとコミュニティサポートの観点から、ImagickとGDはどのように比較されますか?

ImagickとGDには、広範なドキュメントとアクティブなコミュニティサポートがあります。ただし、その歴史が長く使用されているため、GDには既製のリソースとチュートリアルがオンラインであることがよくあります。 Imagickには優れたドキュメントがありますが、特定の解決策や例を見つけるには、より多くの掘削が必要になる場合があります。

ImagicICKまたはGDにセキュリティの問題はありますか?

imagickとGDの両方が安全なライブラリと見なされます。ただし、他のソフトウェアと同様に、不適切に使用すると悪用される可能性もあります。必ずライブラリの最新バージョンを使用して、安全なコーディングのためにベストプラクティスに従ってください。

私のプロジェクトにはどのライブラリを選択する必要がありますか:ImagicickまたはGD?

ImagicCまたはGDの選択は、プロジェクトの特定のニーズに依存します。高度な画像処理機能が必要な場合、または大規模な画像を処理する必要がある場合、Imagicickがより良い選択かもしれません。ただし、よりシンプルなプロジェクトに取り組んでいる場合、またはリソース制限環境で作業している場合、GDがより良い選択かもしれません。

プロジェクトの途中でGDからImagickに切り替えることはできますか(そしてその逆)?

技術的には、プロジェクトの途中でGDからImagickに切り替えることは可能ですが(その逆)、これは通常推奨されません。これは、2つのライブラリが異なる構文名と関数名を使用しているため、切り替えにはコードに大幅な変更が必要になるためです。スイッチを検討している場合は、通常、プロジェクトの開始時に決定を下すのが最善です。

以上がImagicICK vs GDの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。