PHPでの画像処理に苦しむのをやめる方法
GD拡張を使って純粋なPHPでサムネイル生成を書いたことがある人なら、この的痛苦を覚えているでしょう。暗号のようなシグネチャを持つ十几个の低レベル関数、手動の座標計算、そして constantlyのメモリリーク。Imagickでは構文が少し良くなりますが、独自のメソッドのzooがあります。
Intervention Imageライブラリは、10年以上前からまさにこの問題を解決しています。统一的で読みやすいinterfaceの裏でシステム拡張を隠します。このプロジェクトは最近v3/v4に到達し、モダンなPHPバージョン向けにアーキテクチャが完全に書き換えられました。
ライブラリの中身
このプロジェクトは、グラフィックエンジンの上に便利なラッパーを提供します。読みやすくチェーン可能なコードを書くと、ライブラリが内部で必要なシステムコールを自動的に実行します。
ここでの主な特徴は、交換可能なドライバーです。現在このプロジェクトは以下のをサポートしています:
- GD(ほぼすべてのホスティングで利用可能な標準ライブラリ)
- Imagick(ImageMagickに基づく拡張機能)
- libvips(別個のドライバーを通じて低メモリ消費で高速なエンジン)
サーバーにImageMagickがない場合は、アプリケーションのビジネスロジックを書き換えることなく、ドライバーをGDに単に切り替えることができます。高負荷サービスにはlibvipsを接続でき、重い画像を処理する際のRAMをより慎重に扱いながら、何倍も高速に動作します。
別の良い詳細は、すべての利用可能なドライバーでのアニメーション画像(GIF、WebP)の完全なサポートです。以前は、アニメーションを操作するにはImagickに密結合である必要がありました。
コードの姿
始めるには、Composerでライブラリをインストールしてください:
composer require intervention/image
PHP 8.3以降、mbstring拡張機能、および選択したグラフィックモジュールのいずれかが必要です。
画像をスケールし透かしを適用し、結果をWebPまたはJPEGとして保存する基本的な例です:
use Intervention\Image\ImageManager;
use Intervention\Image\Drivers\Gd\Driver as GdDriver;
use Intervention\Image\Alignment;
use Intervention\Image\Format;
// Инициализируем менеджер с нужным драйвером
$manager = ImageManager::usingDriver(GdDriver::class);
// Читаем исходный файл
$image = $manager->decodePath('images/example.webp');
// Пропорционально меняем размер по высоте
$image->scale(height: 300);
// Накладываем водяной знак в правый нижний угол
$image->insert('images/watermark.png', alignment: Alignment::BOTTOM_RIGHT);
// Кодируем результат с заданным качеством
$encoded = $image->encodeUsingFormat(Format::JPEG, quality: 65);
// Сохраняем готовый файл
$encoded->save('images/example.jpg');
この構文はPHP 8の名前付き引数と、Alignment::BOTTOM_RIGHTやFormat::JPEGのようなenumを使用した厳格なタイピングに依存しています。パラメータで間違えることは今はるかに難しく、IDEの自動補完が箱から出してすぐに動作します。
典型的なユースケース
このパッケージは特定のフレームワークに依存していないため、Laravel、Symfony、またはRoadRunnerマイクロサービスに同様に簡単に統合できます。
- アバターとサムネイル生成。切り抜き、正方形へのフィット(
crop、cover、scale)、公開前のメタデータ削除。 - オンデマンドのコンテンツ最適化。重いPNGとJPEGを圧縮付きでモダンなWebPまたはAVIFに変換。
- 著作権保護。CDNにファイルを提供する前にバッチ透かし入れとロゴオーバーレイ。
- アニメーションの操作。フレームを失うことなくGIFの切り抜きまたはリサイズ。
プロジェクトに追加する価値があるか
PHP 8.3+で書いていてユーザーファイルを処理する必要がある場合、Intervention Imageは多くの時間を節約できます。本質的に、PHPエコシステムにおけるグラフィックスのデファクトスタンダードです。
1つのニュアンスとして、プロジェクトが7.4や8.1のような古いPHPバージョンに縛られている場合、完全に異なるAPIを持つv2ブランチに留まる必要があります。しかし、新しいスタックにとっては、ライブラリは完璧にフィットします。
関連プロジェクト