ホームページ  >  記事  >  バックエンド開発  >  Laravel画像処理拡張パッケージの詳細説明 介入・イメージ

Laravel画像処理拡張パッケージの詳細説明 介入・イメージ

*文
*文オリジナル
2018-01-03 17:41:514506ブラウズ

この記事では、LaravelにおけるIntervention/image画像処理拡張パッケージのインストールと使い方、使用中に遭遇する可能性のある落とし穴の解決方法を中心に、サンプルコードを交えて詳しく紹介しています。あなたの勉強や仕事に重要な学習価値を必要とする友人は、編集者をフォローして一緒に学習してください。お役に立てれば幸いです。

はじめに

Intervention/image は、Laravel 用にカスタマイズされた画像処理ツールで、画像の作成と編集を簡単に表現できます。

デモ

デモのスクリーンショット


デモの実行

Homesteadを使用してLaravelプロジェクトを素早く実行する方法のドキュメントを参照してください。

記事の概要

    インストール;
  • 基本的な使い方;
  • 以下は詳細な説明です。
  • 1. インストール

1) を使用してインストールします:

composer require intervention/image

上記のコマンドは、app/config/app.php を変更して ServiceProvider:

// 将下面代码添加到 providers 数组中
'providers' => [
 // ...
 Intervention\Image\ImageServiceProvider::class,
 // ...
 ],


// 将下面代码添加到 aliases 数组中
'aliases' => [
 // ...
 'Image' => Intervention\Image\Facades\Image::class,
 // ...
 ],
2 を追加します。画像処理ライブラリ

この拡張パッケージはデフォルトで画像処理にPHPのGDライブラリを使用していますが、GDライブラリの画像処理効率はimagemagickライブラリに比べて若干劣るため、画像処理ライブラリimagemagickライブラリに置き換えることを推奨します

始める前に、まず GD または Imagick がローカルにインストールされていることを確認する必要があります。

Intervention Image を使用する場合は、配列パラメーターを ImageManager に渡すだけで、GD と Imagick ライブラリ間の相互切り替えが完了します。 以下に示すように:

// 引入 composer autoload
require 'vendor/autoload.php';

// 导入 Intervention Image Manager Class
use Intervention\Image\ImageManager;

// 通过指定 driver 来创建一个 image manager 实例
$manager = new ImageManager(array('driver' => 'imagick'));

// 最后创建 image 实例
$image = $manager->make('public/foo.jpg')->resize(300, 200);

さらに、以下に示すように、ImageManager の静的バージョンを使用することもできます:

// 引入 composer autoload
require 'vendor/autoload.php';

// 导入 Intervention Image Manager Class
use Intervention\Image\ImageManagerStatic as Image;

// 通过指定 driver 来创建一个 image manager 实例 (默认使用 gd)
Image::configure(array('driver' => 'imagick'));

// 最后创建 image 实例
$image = Image::make('public/foo.jpg')->resize(300, 200);
config/image.php 構成ファイルを生成します:
php artisan vendor:publish --provider="Intervention\Image\ImageServiceProviderLaravel5"
上記のコマンドを実行した後、構成/image.php 設定ファイルがプロジェクト内に生成されます。このファイルを開き、ドライバーを imagick:
return array(
 'driver' => 'imagick'
);

に変更します。この時点で、この拡張パックは正常にインストールされています!

3. 基本的な使用方法

// 修改指定图片的大小
$img = Image::make('images/avatar.jpg')->resize(200, 200);

// 插入水印, 水印位置在原图片的右下角, 距离下边距 10 像素, 距离右边距 15 像素
$img->insert('images/watermark.png', 'bottom-right', 15, 10);

// 将处理后的图片重新保存到其他路径
$img->save('images/new_avatar.jpg');

/* 上面的逻辑可以通过链式表达式搞定 */
$img = Image::make('images/avatar.jpg')->resize(200, 200)->insert('images/new_avatar.jpg', 'bottom-right', 15, 10);

4. 機能

基本的な使用法に加えて、この拡張パックは次の機能もサポートしています。

画像のキャッシュ機能。機能: 統一されたルールに従って画像を変換します。

画像の動的処理: アクセスされた画像の URL パラメーターに従って画像サイズを自動的に調整しますその他の例については、公式ドキュメントを参照してください。

介入/画像の小さな落とし穴とその解決方法
  • 実際、介入/iamge は長い間使用されており、その API 設計は非常にシンプルで、ドキュメントも非常に包括的で、非常に簡単です。使用。
  • でも最近、偶然小さな穴を発見しました。 QR コードと WeChat アバターを合成する必要があるため、Image::make($avatarUrl) (ここでの $avatarUrl は WeChat アバターへのリンクです) を使用してアバターを生成し、それを QR コード画像に合成します (テンプレートの背景の使用やテキストの書き込みなど、他の操作も含まれます)。

    書いた後に実行してみると、かなり遅いことが分かり、平均で23秒ほどかかりました。最初は合成時の操作が多くサイズも比較的大きかったのでこのくらいの速度になっているのかと思いました。しかし、少し時間ができたので、速度を向上させることはできなかったとしても、最適化に時間がかかる理由を少なくとも理解することができました。
  • これに苦労した結果、真実は合成操作の数やサイズとはほとんど関係がないことがわかりました。ポイントはアバターデータを作成するポーズにあります。

    この問題を説明するために、次のコードが比較のために特別に作成されました。
  • // 记录开始时间
    $startTimestamp = microtime(true);
    
    $url = 'http://wx.qlogo.cn/mmopen/XxT9TiaJ1ibf06TNRCMjQADS4opDHvQLguLZHpqkRlvuJYZicvJW4iaOalPsKIs0kpZ3F6864ZzibyObYiaucUQSrdp4pFTNDyIpxw/0';
    
    $avatar = \Image::make($url);
    
    // 记录结束时间
    $endTimestamp = microtime(true);
    
    info($startTimestamp);
    info($endTimestamp);
    info($endTimestamp - $startTimestamp);
上記のコードは、Image::make($url) の形式を使用して、URL から直接アバターを生成します。記録されたログデータから判断すると、所要時間は基本的に 16 秒程度です。

その後、新しい姿勢を考えましたが、実はそれを最適化しようとしているときに思いつきました。以下のコードを参照してください:

$startTimestamp = microtime(true);

$client = new \GuzzleHttp\Client();

$url = 'http://wx.qlogo.cn/mmopen/XxT9TiaJ1ibf06TNRCMjQADS4opDHvQLguLZHpqkRlvuJYZicvJW4iaOalPsKIs0kpZ3F6864ZzibyObYiaucUQSrdp4pFTNDyIpxw/0';

$avatarResponse = $client->get($url);

$avatar = \Image::make($avatarResponse->getBody()->getContents());

$endTimestamp = microtime(true);

info($startTimestamp);
info($endTimestamp);
info($endTimestamp - $startTimestamp);
ここでは、最初に GuzzleHttp を使用してアバターを取得し、次に Image::make($data) を使用してアバターを作成します。 注意、もうすぐクライマックスです…サングラス

以下のログのスクリーンショットを見てください。3 回にかかった平均時間は約 0.07 秒で、前の 16 秒よりも 200 倍以上悪いです。

なぜこの現象が起こるのかはまだわかりませんが、これは間違いなく便利でニッチな体験です。

関連する推奨事項:

Laravelのローカリゼーションモジュールの詳細な説明

Laravelでルーティングパラメータを取得する方法の詳細な説明

ロードプロセスの詳細な説明ファサードの原理ララベル

以上がLaravel画像処理拡張パッケージの詳細説明 介入・イメージの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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