圖片處理擴充套件 Intervention/image 的簡單使用

社會主義接班人發表於2020-03-30

Intervention Image是一個開源的PHP影像處理和操作庫。 它提供了一種建立,編輯和合成影像的簡便且富有表現力的方式,並支援當前兩個最常見的影像處理庫GD Library和Imagick。
編寫該類是為了使PHP影像操作更容易且更具表現力。 無論您是要建立影像縮圖,水印還是對大型影像檔案進行格式化,Intervention Image都可以幫助您以最少的程式碼行輕鬆地管理每個任務。
該庫遵循FIG標準PSR-2,以確保共享的PHP程式碼之間的高度互操作性,並且經過了完全的單元測試。

一、 環境要求

  • PHP >=5.4
  • Fileinfo Extension
  • GD Library (>=2.0)
  • Imagick PHP extension (>=6.5.7)

二、 安裝及配置

  • composer 安裝
composer require intervention/image
  • app/config/app.php 新增 providers 陣列中新增如下程式碼:
/*
 * Package Service Providers...
 */
Intervention\Image\ImageServiceProvider::class,
  • app/config/app.php 新增 aliases 陣列中新增如下程式碼:
'Image' => Intervention\Image\Facades\Image::class,
  • 釋出擴充套件生成 config/image.php 配置檔案
php artisan vendor:publish --provider="Intervention\Image\ImageServiceProviderLaravelRecent"
  • config/image.php 修改驅動為imagick
// Imagick 處理效果和效率比 GD 好
'driver' => 'imagick'

三、常用API 及用法

建立影像

  • canvas() 建立一個空的畫布
public Intervention\Image\ImageManager canvas(integer $width, integer $height, [mixed $bgcolor])
引數 描述
width 寬度
height 高度
bgcolor 背景顏色(可選)
// 例項化一個空的 100*100 透明背景空 canvas 影像資源物件
$img =  Image::canvas(100, 100);  
// 例項化一個空的 100*100 背景色為 #ff0000  canvas 影像資源物件
$img =  Image::canvas(100,  100,  '#ff0000');
  • make() 從給定圖片例項化新影像例項
public static Intervention\Image\ImageManager make(mixed $source)
引數 描述
source 該方法高度可變,可讀取下面列出的所有輸入型別:
string檔案系統的圖片路徑,
string圖片的URL地址(allow_url_fopen必須啟用),
string 二進位制圖片資料,
string data-url編碼的圖片資料,
string base64編碼的圖片資料,
resource gd型別的PHP資源(當使用GD庫),
object Imagick例項(當使用Imagick庫),
object Intervention\Image\Image 例項,
object SplFileInfo instance (To handle Laravel file uploads via Symfony\Component\HttpFoundation\File\UploadedFile) laravel框架自帶的圖片上傳例項
// 以 foo.jpg 資原始檔例項化一個 Image 物件 
$img = Image::make('public/foo.jpg');

// 例項化一個 GD 建立的圖象的 Image 物件
$img = Image::make(imagecreatefromjpeg('public/foo.jpg'));

// URL
$img = Image::make('http://example.com/example.jpg');

// 直接從 Laravel 檔案上傳資源例項化一個 Image 物件
$img = Image::make(Input::file('photo'));

改變影像尺寸的方法

  • resize() 調整當前影像的大小
public Intervention\Image\Image resize (integer $width, integer $height, [Closure $callback])
引數 描述
width 設定寬度
height 設定高度
callback 閉包回撥函式(可選),aspectRatio()用於約束寬高比例,upsize()防止影像放大(如果調整寬度超過影像原始寬度時,就保持影像原始寬度不變)
// 將影像調整為固定大小
$img->resize(300, 200);
// 防止可能的尺寸變化
$img->resize(300, null, function ($constraint) {   
    $constraint->aspectRatio();   // 按比例調整圖片大小
    $constraint->upsize();  // 這裡如果寬度不足 300 時,保持原來尺寸
});
  • widen()按給定寬度按比例調整影像大小
public Intervention\Image\Image widen(integer $width, [Closure $callback])
引數 描述
width 設定寬度
callback 閉包回撥函式(可選),upsize()防止不必要的影像放大
// 將影像寬度調整為 300px,注意:寬度縮放的時候,高度是按比例變化的
$img = Image::make('public/foo.jpg')->widen(300);

// 將影像寬度調整為 300px,如果調整寬度超過影像原始寬度時,就保持影像原始寬度不變
$img = Image::make('public/foo.jpg')->widen(300, function ($constraint) {
    $constraint->upsize();
});

heighten()widen() 功能類似

  • crop() 裁剪影像
public Intervention\Image\Image crop(int $width, int $height, [int $x, int $y])
引數 描述
width 裁剪矩形寬度
height 裁剪矩形高度
x 裁剪矩形左上角的X座標。 預設情況下,矩形部分將在當前影像上居中
y 裁剪矩形左上角的Y座標。 預設情況下,矩形部分將在當前影像上居中
$img = Image::make('public/foo.jpg');

// 將影像從座標 (25, 25)為切口裁剪為 200 * 100 大小
$img->crop(200, 100, 25, 25);

$img->crop(200, 100);
  • fit() 以智慧的方式,結合裁剪和調整來格式化圖片,該方法將會自動找到給定的寬、高的最佳寬高比,裁剪並調整到給定尺寸
public Intervention.mage.mage fit( int $width, [ [int $height], [Closure $callback, [ string $position ]] ])
引數 描述
width 裁剪出最合適的寬高比後,影像的寬度將被調整為該寬度
height 裁剪出最合適的寬高比後,影像的高度將被調整為該高度(可選), 如果未給出高度,則方法將使用與寬度相同的值
callback 閉包回撥函式(可選),upsize()防止不必要的影像放大
position 設定裁剪的位置(可選), 可選值:top-left、 top、top-right 、left、center (default)、right、bottom-left 、bottom、bottom-right
$img = Image::make('public/foo.jpg');

// 按照 1:1 的比例裁剪,然後縮放大小為 100 * 100
$img->fit(100);

// 按照 5:6 的比例裁剪,然後縮放大小為 100 * 120,並防止圖片放大
$img->fit(100, 120, function ($constraint) {
    $constraint->upsize();
});
  • resizeCanvas() 調整影像的邊界到給定的寬和高
public Intervention\Image\Image resizeCanvas (int $width, int $height, [string $anchor, [boolean $relative, [mixed $bgcolor]]])
引數 描述
width 絕對模式下影像的新寬度 或 相對模式下在原來圖片尺寸上,新增或者減去給定的寬、高
height 絕對模式下影像的新高度,或相對模式下要從高度增加或減少的畫素數量
anchor 設定要調整影像大小的位置。 例如,如果將錨點設定為左下角,則此邊將被固定,並且會將width / height的值新增或減去到影像的右上角,可選值:top-left、 top、top-right 、left、center (預設)、right、bottom-left 、bottom、bottom-right
relative 確定調整大小將在相對模式下進行, 這意味著width或height的值將與影像的當前高度相加或相減, 預設值:false
bgcolor 影像新區域的背景色, 可以以不同的顏色格式傳遞背景色, 預設值:#ffffff,如果輸出格式支援則透明
$img = Image::make('public/foo.jpg');
// 調整影像畫布的大小為 300 * 200 
$img->resizeCanvas(300, 200);
// 只調整畫布的寬度為 300 ,高度不變
$img->resizeCanvas(300, null);
// 從右下角開始來調整畫布的大小為 300 * 200
$img->resizeCanvas(300, 200, 'bottom-right');
// 在相對模式下調整畫布的大小為 以原始圖片中心點為錨點 ,寬度增加 10 ,高度減少 10 
$img->resizeCanvas(10, -10, 'center', true,);
// 設定背景色
$img->resizeCanvas(1280, 720, 'center', false, 'ff00ff');

繪畫的方法

  • text() 將文字寫入到圖片上
public Intervention\Image\Image text(string $text, [integer $x, [integer $y, [Closure $callback]]])
引數 描述
text 要寫入的文字
x 定義寫入文字第一個字元基點的 X 座標(可選), 預設值:0
y 定義寫入文字第一個字元基點的 Y 座標(可選), 預設值:0
callback 回撥函式(可選):
file($filepath) 設定字型檔案的路徑或GD 庫內部字型,範圍1到5之間的整數值,預設值1
size($size) 大小,字型大小僅在設定字型檔案時可用,否則將被忽略, 預設值:12
color($color)顏色
align($align)水平對齊方式:left、right、center,預設left
valign($valign)垂直對齊方式:top、bottom、middle,預設bottom
angle($angle)旋轉角度,文字將圍繞垂直和水平對齊點逆時針旋轉, 旋轉僅在設定字型檔案時可用,否則將被忽略
$img = Image::make(''public/foo.png');

$img->text('測試文字', 50,50, function($font) {
    $font->file('public/Alibaba-PuHuiTi-Light.ttf');
    $font->size(24);
    $font->color('#000');
    //$font->align('center');
    //$font->valign('top');
    //$font->angle(45);
});
  • pixel() 繪製點( 在給定的座標上,以給定的顏色繪製單個畫素點)
public Intervention\Image\Image pixel(mixed $color, integer $x, integer $y)
引數 描述
color 顏色
x X座標
y Y座標
$img = Image::canvas(100, 100, '#ddd');
// 繪製一個座標為 (32, 32),顏色為藍色的點
$img->pixel('#0000ff', 32, 32);
  • line() 繪製線
public Intervention\Image\Image line(int $x1, int $y1, int $x2, int $y2, [Closure $callback])
引數 描述
x1 起點的X座標
y1 起點的Y座標
x2 終點的X座標
y2 終點的Y座標
callback 回撥函式( 可選 ):
color()設定顏色, 預設值:#000000
width()設定線條的寬度(GD驅動程式不提供該選項)預設值:1px
$img = Image::make('public/foo.jpg');
// 繪製一條起點座標為(10, 145),終點座標為(185, 145),寬度為 5px 的紅色線
$img->line(10, 145, 185, 145, function($draw){
    $draw->color('#f00');
    $draw->width(1);
});                    
  • rectangle() 繪製矩形(左上角位於x,y點1,右下角位於x,y點2)
public Intervention\Image\Image rectangle(int $x1, int $y1, int $x2, int $y2, [Closure $callback])
引數 描述
x1 矩形左上角點的X座標
y1 矩形左上角點的Y座標
x2 矩形右下角點的X座標
y2 矩形右下角點的Y座標
callback 回撥定義整體外觀(可選 ):
background($color) 設定背景色 ,border($width,$color) 設定矩形的邊框
$img = Image::make('public/foo.jpg');
// 繪製左上角點座標為 (5, 95) 右下角點座標 (190, 143) ,邊框寬度為 2px顏色為紅色 ,背景色為紅色的矩形
$img->rectangle(5, 95, 190, 143, function($draw){
  //$draw->background('#FFF');
  $draw->border(2, '#f00');
});
  • circle() 繪製圓
public Intervention\Image\Image circle( integer $diameter, integer $x, integer $y, [Closure $callback] )
引數 描述
diameter 直徑
pos_x 圓心X座標
pos_y 圓心Y座標
callback 回撥定義整體外觀 (可選 ):
background($color) 設定背景色
border($width, $color)設定邊的寬度和顏色
$img = Image::canvas(300, 200, '#ddd');
// 繪製一個半徑為 10px,圓心座標為 (100, 100),邊框寬度為 1px ,邊框顏色為紅色,並填充顏色為藍色的圓
$img->circle(10, 100, 100, function ($draw) {
    $draw->background('#0000ff');
    $draw->border(1, '#f00');
});
  • ellipse() 繪製橢圓
public Intervention\Image\Image ellipse(int $width, int $height, int $x, int $y, [Closure $callback])
引數 描述
width 橢圓的寬度, 預設值:10
height 橢圓高度, 預設值:10
x 中心點的 X 座標
y 中心點的 Y 座標
callback 回撥定義整體外觀(可選 ):
background($color) 設定背景色,border($width, $color)設定邊的寬度和顏色
$img = Image::make('public/foo.jpg');
// 繪製寬度為 200,高度為 80,中心點為 (100, 118),邊框寬度為 1px 顏色為紅色,背景色為藍色的橢圓
$img->ellipse(200, 80, 100, 118, function ($draw) {
   // $draw->background('#0000ff');
    $draw->border(1, '#ff0000');
});

*polygon() 繪製多邊形

public Intervention\Image\Image polygon(array $points, [Closure $callback])
引數 描述
points 各個角的座標,格式為一維陣列 ,例如[ 0, 0, 1100, 0, 1100, 250]
callback 回撥定義整體外觀(可選 ):
background($color) 設定背景色,
border($width, $color)設定邊的寬度和顏色
$img = Image::canvas(800, 600, '#ddd');
// 繪製一個邊框為紅色,填充背景色為藍色的多邊形
$img->polygon([
      0, 0, 
      1100, 0, 
      1100, 250
], function ($draw) {
    $draw->background('#0000ff');
    $draw->border(1, '#ff0000');
});

影像的其它處理方法

  • fill() 用顏色或圖案填充影像
public Intervention\Image\Image fill(mixed $filling, [integer $x, integer $y])
引數 描述
filling 填充顏色或影像,影像資源格式如下:
string檔案系統的圖片路徑
string圖片的 URL 地址(allow_url_fopen必須啟用)
string二進位制圖片資料
string data-url 編碼的圖片資料
string base64 編碼的圖片資料
resource gd 型別的 PHP 資源(當使用 GD 庫)
object Imagick 例項(當使用Imagick庫)
objectIntervention\Image\Image 例項
object SplFileInfo instance (To handle Laravel file uploads via Symfony\Component\HttpFoundation\File\UploadedFile) laravel 框架自帶的圖片上傳例項
x 填充起始點的X軸座標(可選)
y 填充起始點的Y軸座標(可選)

如果指定了x、y座標,則將基於此位置的顏色來填充,未指定座標時填充整個影像
圖形學中Flood Fill是 漫水填充,是用來填充區域的。就好比在一個地方一直倒水,水會往四周滿延開,直到高地阻擋。Flood Fill就是從一個點開始往四周尋找相同的點填充,直到有不同的點為止。

$img = Image::canvas(800, 600);
// 用 #cccccc 填充影像
$img->fill('#cccccc');
//  用 tile.png 填充影像
$img->fill('tile.png');
// flood fill 填充
$img->fill('#ff00ff', 0, 0);
  • insert() 插入圖片
public Intervention\Image\Image insert(mixed $source, [string $position, [integer $x, integer $y]])
引數 描述
source 要插入的影像, 該方法可以處理以下型別的輸入:
string檔案系統的圖片路徑
string圖片的URL 地址(allow_url_fopen必須啟用)
string二進位制圖片資料
string data-url 編碼的圖片資料
stringbase64編碼的圖片資料
resource gd 型別的 PHP 資源(當使用 GD 庫)
object Imagick 例項(當使用 Imagick 庫)
object Intervention\Image\Image 例項
objectSplFileInfo instance (To handle Laravel file uploads via Symfony\Component\HttpFoundation\File\UploadedFile) laravel 框架自帶的圖片上傳例項
position 插入影像的位置(可選),引數:
top-left (預設)
top
top-right
left
center
right
bottom-left
bottom
bottom-right
x X 偏移座標 預設值:0(可選)
y Y 偏移座標 預設值:0(可選)
$img = Image::make('public/foo.jpg');
// 在右下角插入10畫素偏移量的水印
$img->insert('public/watermark.png', 'bottom-right', 10, 10);

獲取影像資訊常用的方法

  • width() 獲取影像寬度
// 獲取影像的寬度
$width = Image::make('public/foo.jpg')->width();

height() 功能和 width() 類比

輸出影像資料的方法

  • save() 儲存影像,可指定路徑和影像質量
  • public Intervention\Image\Image save([string $path, [int $quality], [string $format]])
引數 描述
path 設定影像儲存路徑(可選),如果影像是從一個存在的檔案路徑建立的,同時我們未指定 $path,將會嘗試覆蓋該路徑
quality 設定影像質量(可選)範圍從0(質量差,小檔案)到100(最佳質量,大檔案), 僅當JPG格式時有用,因為PNG壓縮是無損的,並且不會影響影像質量, 預設值為90
format 設定影像將被儲存的格式(可選)
$img = Image::make('public/foo.jpg')->resize(300, 200);
$img->save('public/foo', 80, 'jpg');
  • response() 直接作為HTTP響應
public Intervention\Image\Image response([string $format, [integer $quality]])
引數 描述
format 設定影像的格式( 可選),jpg、png、gif、tif、bmp,預設是jpeg
quality 設定影像質量( 可選,範圍從0(質量差,小檔案)到100(最佳質量,大檔案), 僅當JPG格式時有用,因為PNG壓縮是無損的,並且不會影響影像質量, 預設值為90
$img = Image::canvas(800, 600, '#ff0000');
// 直接輸出
echo $img->response();
  • encode() 影像進行編碼
public Intervention\Image\Image encode([mixed $format, [int $quality]])
引數 描述
format 編碼格式( 可選): jpg、png、gif、tif、bmp、data-url(base64)。預設返回的編碼後的資料。預設型別是 jpeg
quality 設定影像質量( 可選),範圍從0(質量差,小檔案)到100(最佳質量,大檔案), 僅當JPG格式時有用,因為PNG壓縮是無損的,並且不會影響影像質量, 預設值為90
// 將 png 格式影像編碼為 jpg 格式
$jpg = (string) Image::make('public/foo.png')->encode('jpg', 75);
// 將影像編碼為base64 格式
$data = (string) Image::make('public/bar.png')->encode('data-url');
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章