CodeIgniter4 圖像處理類

2020-08-14 15:47 更新

CodeIgniter的圖像處理類允許你執(zhí)行以下操作:

  • 圖像大小調(diào)整
  • 創(chuàng)建縮略圖
  • 圖像裁剪
  • 圖像旋轉(zhuǎn)
  • 圖像水印

圖像處理類支持使用以下圖像庫:GD/GD2和 ImageMagick

初始化類

與CodeIgniter中的大多數(shù)其他類一樣,你可以通過控制器中調(diào)用Services類的初始化圖像處理類:

$image = Config\Services::image();

你可以將要使用的圖像庫的別名傳遞給服務(wù)功能:

$image = Config\Services::image('imagick');

可用的圖像庫處理程序如下:

  • gd 對應(yīng)調(diào)用的是GD/GD2圖像庫。
  • imagick 對應(yīng)調(diào)用的是ImageMagick圖像庫。

如果你要使用ImageMagick圖像庫,則必須要在 application/Config/Images.php 中設(shè)置服務(wù)器上該庫的所在路徑。

注解

ImageMagick處理程序不需要在服務(wù)器上加載imagick擴(kuò)展。只要你的腳本可以訪問該庫并且可以使用 exec() 運行在服務(wù)器上,它就可以工作。

處理圖像

無論你執(zhí)行何種圖像的處理方法函數(shù)(調(diào)整大小、裁剪、旋轉(zhuǎn)、使用水?。话阏{(diào)用過程都是相同的。 你將根據(jù)要執(zhí)行的操作設(shè)置一些首選項,然后調(diào)用其中一個你需要的使用的可用處理函數(shù):

$image = Config\Services::image()
        ->withFile('/path/to/image/mypic.jpg')
        ->fit(100, 100, 'center')
        ->save('/path/to/image/mypic_thumb.jpg');

上面的代碼告我們它會查找來自image文件夾中的名為mypic.jpg的圖像,然后使用GD2 image_library圖像庫來創(chuàng)建一個100 x 100像素的新圖像,并將其保存到新文件(the thumb)。 由于它使用fit()方法,它將嘗試根據(jù)所需的寬高比找到要裁剪的圖像的最佳部分,然后裁剪并調(diào)整結(jié)果大小。

在保存新圖像之前,可以根據(jù)需求來通過許多可用方法來處理圖像。原始圖像將保持原樣,而新圖像會通過每個方法傳參,將處理結(jié)果應(yīng)用于直接的結(jié)果之上:

$image = Config\Services::image()
        ->withFile('/path/to/image/mypic.jpg')
        ->reorient()
        ->rotate(90)
        ->crop(100, 100, 0, 0)
        ->save('/path/to/image/mypic_thumb.jpg');

此示例將采用相同的圖像并首先修復(fù)任何移動電話的定向問題,圖像將旋轉(zhuǎn)90度,然后從左上角開始將結(jié)果裁剪為100x100像素圖像。結(jié)果將保存成縮略圖。

注解

為了讓圖像處理類可以進(jìn)行任何處理,包含圖像文件的文件夾必須具有寫入權(quán)限。

對于某些操作,圖像處理時可能需要相當(dāng)大量的服務(wù)器內(nèi)存。如果在處理圖像時遇到內(nèi)存不足錯誤,可能需要限制其圖像的最大大小,和/或調(diào)整PHP內(nèi)存限制。

處理方法

有六種可用的處理方法可以調(diào)用:

  • $image->crop()
  • $image->fit()
  • $image->flatten()
  • $image->flip()
  • $image->resize()
  • $image->rotate()
  • $image->text()

這些方法將會返回類實例,如上所示,它們可以鏈接在一起。如果失敗,它們將拋出包含錯誤的消息到 CodeIgniter\Images\ImageException 。 一個好的做法是捕獲異常消息,在失敗時顯示錯誤,如下所示:

try {
$image = Config\Services::image()
    ->withFile('/path/to/image/mypic.jpg')
    ->fit(100, 100, 'center')
    ->save('/path/to/image/mypic_thumb.jpg');
}
catch (CodeIgniter\Images\ImageException $e)
{
        echo $e->getMessage();
}

注解

你可以選擇通過在函數(shù)中提交開始/結(jié)束標(biāo)記來指定要應(yīng)用于錯誤的HTML格式,如下所示:


$this-&image_lib-&display_errors('<p&', '</p&');

圖像裁剪

圖像可以被裁剪,只保留原始圖像的一部分。通常用于創(chuàng)建特定大小/縱橫比匹配的縮略圖圖像。這是用 crop() 方法處理的:

crop(int $width = null, int $height = null, int $x = null, int $y = null, bool $maintainRatio = false, string $masterDim = 'auto')

  • $width 是結(jié)果圖像的所需寬度,以像素為單位。
  • $height 是結(jié)果圖像的所需高度,以像素為單位。
  • $x 是從圖像左側(cè)開始裁剪的像素數(shù)。
  • $y 是從圖像頂部開始裁剪的像素數(shù)。
  • $maintainRatio 如果為true,將根據(jù)需要調(diào)整最終尺寸以保持圖像的原始高寬比。
  • $masterDim 可使其保持不變的維度,當(dāng)$maintainRatio為true時。值可以是:’width’,’height’或’auto’。

要從圖像中心取出50x50像素的正方形,你需要首先計算適當(dāng)?shù)膞和y偏移值:

$info = Services::image('imagick')
            ->withFile('/path/to/image/mypic.jpg')
            ->getFile()
            ->getProperties(true);


$xOffset = ($info['width'] / 2) - 25;
$yOffset = ($info['height'] / 2) - 25;


Services::image('imagick')
            ->withFile('/path/to/image/mypic.jpg')
            ->crop(50, 50, $xOffset, $yOffset)
            ->save('path/to/new/image.jpg');

擬合圖像

使用 fit() 方法旨在通過執(zhí)行以下步驟幫助簡化以“智能”方式裁剪圖像的一部分:

  • 確定要裁剪的原始圖像的正確部分,以保持所需的寬高比。
  • 裁剪原始圖像。
  • 調(diào)整大小到最終尺寸。

fit(int $width, int $height = null, string $position = 'center')

  • $width 是圖像的最終寬度。
  • $height 是圖像所需的最終高度。
  • $position 確定要裁剪的圖像部分。允許的位置: ‘top-left’, ‘top’, ‘top-right’, ‘left’, ‘center’, ‘right’, ‘bottom-left’, ‘bottom’, ‘bottom-right’。

這里提供一種更簡單的裁剪方式,可以始終保持縱橫比:

Services::image('imagick')
        ->withFile('/path/to/image/mypic.jpg')
        ->fit(100, 150, 'left')
        ->save('path/to/new/image.jpg');

展平圖像

使用 flatten() 方法旨在在透明圖像(PNG)后面添加背景顏色并將RGBA像素轉(zhuǎn)換為RGB像素

  • 從透明圖像轉(zhuǎn)換為jpgs格式時指定背景顏色。

flatten(int $red = 255, int $green = 255, int $blue = 255)

  • $red 是背景的紅色值。
  • $green 是背景的綠色值。
  • $blue 是背景的藍(lán)色值。

Services::image('imagick')
        ->withFile('/path/to/image/mypic.png')
        ->flatten()
        ->save('path/to/new/image.jpg');


Services::image('imagick')
        ->withFile('/path/to/image/mypic.png')
        ->flatten(25,25,112)
        ->save('path/to/new/image.jpg');

翻轉(zhuǎn)圖像

圖像可以沿水平軸或垂直軸翻轉(zhuǎn):

flip(string $dir)

  • $dir 指定要翻轉(zhuǎn)的軸??梢允恰按怪薄被颉八健?。

Services::image('imagick')
        ->withFile('/path/to/image/mypic.jpg')
        ->flip('horizontal')
        ->save('path/to/new/image.jpg');

調(diào)整圖像大小

可以使用resize()方法調(diào)整圖像大小以適合你需要的任何維度:

resize(int $width, int $height, bool $maintainRatio = false, string $masterDim = 'auto')

  • $width 是新圖像的所需寬度(以像素為單位)
  • $height 是新圖像的所需高度(以像素為單位)
  • $maintainRatio 確定圖像是否被拉伸以適應(yīng)新尺寸,或者是否保持原始寬高比。
  • $masterDim 指定在保持比率時哪個軸應(yīng)該具有其維度。’寬度’,’高度’。

調(diào)整圖像大小時,你可以選擇是保持原始圖像的比例,還是拉伸/壓縮新圖像以適合所需的尺寸。 如果$maintainRatio為true,則$masterDim指定的尺寸將保持不變,而另一個尺寸將更改為與原始圖像的縱橫比相匹配。

Services::image('imagick')
        ->withFile('/path/to/image/mypic.jpg')
        ->resize(200, 100, true, 'height')
        ->save('path/to/new/image.jpg');

旋轉(zhuǎn)圖像

使用 rotate() 方法允許你以90度的增量旋轉(zhuǎn)圖像:

rotate(float $angle)

  • $angle 是要旋轉(zhuǎn)的度數(shù)?!?0’,’180’,’270’之一。

注解

雖然$angle參數(shù)接受float,但它會在進(jìn)程中將其轉(zhuǎn)換為整數(shù)。 如果該值不是上面列出的三個值, 他會拋出一個自CodeIgniterImagesImageException的圖像異常錯誤.

添加文本水印

你可以使用text()方法非常簡單地將文本水印疊加到圖像上。 這對于放置版權(quán)聲明,攝影師名稱或簡單地將圖像標(biāo)記為預(yù)覽非常有用,這會使它們最終不會用于其他人的產(chǎn)品上。

text(string $text, array $options = [])

第一個參數(shù)是你要顯示的文本字符串。第二個參數(shù)是一個選項數(shù)組,允許你指定文本的顯示方式:

Services::image('imagick')
        ->withFile('/path/to/image/mypic.jpg')
        ->text('Copyright 2017 My Photo Co', [
            'color'      => '#fff',
            'opacity'    => 0.5,
            'withShadow' => true,
            'hAlign'     => 'center',
            'vAlign'     => 'bottom',
            'fontSize'   => 20
        ])
        ->save('path/to/new/image.jpg');

可識別的選項如下:

  • color 文本顏色 (十六進(jìn)制數(shù)字), 即#ff0000
  • opacity 設(shè)置一個介于0到1之間的數(shù)字,表示文本的不透明度。
  • withShadow 以布爾值是否來顯示陰影。
  • shadowColor 設(shè)定陰影的顏色(十六進(jìn)制數(shù))。
  • shadowOffset 偏移陰影的像素數(shù)。適用于垂直和水平值。
  • hAlign 水平對齊:左,中,右
  • vAlign 垂直對齊:頂部,中間,底部
  • hOffset 指定x軸上的附加偏移,以像素為單位
  • vOffset 指定y軸上的附加偏移,以像素為單位
  • fontPath 要使用的TTF字體的完整服務(wù)器路徑。如果沒有給出系統(tǒng)字體,將使用系統(tǒng)字體。
  • fontSize 要使用的字體大小。將GD處理程序與系統(tǒng)字體一起使用時,有效值介于1-5之間。

注解

ImageMagick驅(qū)動程序無法識別fontPath的完整服務(wù)器路徑。相反,需要你提供希望使用的已安裝系統(tǒng)字體之一的名稱,即如Calibri。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號