圖像處理類?
CodeIgniter的圖像處理類允許你執(zhí)行以下操作:
- 圖像大小調整
- 創(chuàng)建縮略圖
- 圖像裁剪
- 圖像旋轉
- 圖像水印
圖像處理類支持使用以下圖像庫:GD/GD2和 ImageMagick
初始化類?
與CodeIgniter中的大多數(shù)其他類一樣,你可以通過控制器中調用Services類的初始化圖像處理類:
$image = Config\Services::image();
你可以將要使用的圖像庫的別名傳遞給服務功能:
$image = Config\Services::image('imagick');
可用的圖像庫處理程序如下:
- gd 對應調用的是GD/GD2圖像庫。
- imagick 對應調用的是ImageMagick圖像庫。
如果你要使用ImageMagick圖像庫,則必須要在 application/Config/Images.php 中設置服務器上該庫的所在路徑。
注解
ImageMagick處理程序不需要在服務器上加載imagick擴展。只要你的腳本可以訪問該庫并且可以使用 exec()
運行在服務器上,它就可以工作。
處理圖像?
無論你執(zhí)行何種圖像的處理方法函數(shù)(調整大小、裁剪、旋轉、使用水?。?,一般調用過程都是相同的。 你將根據(jù)要執(zhí)行的操作設置一些首選項,然后調用其中一個你需要的使用的可用處理函數(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ù)所需的寬高比找到要裁剪的圖像的最佳部分,然后裁剪并調整結果大小。
在保存新圖像之前,可以根據(jù)需求來通過許多可用方法來處理圖像。原始圖像將保持原樣,而新圖像會通過每個方法傳參,將處理結果應用于直接的結果之上:
$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');
此示例將采用相同的圖像并首先修復任何移動電話的定向問題,圖像將旋轉90度,然后從左上角開始將結果裁剪為100x100像素圖像。結果將保存成縮略圖。
注解
為了讓圖像處理類可以進行任何處理,包含圖像文件的文件夾必須具有寫入權限。
注解
對于某些操作,圖像處理時可能需要相當大量的服務器內存。如果在處理圖像時遇到內存不足錯誤,可能需要限制其圖像的最大大小,和/或調整PHP內存限制。
處理方法?
有六種可用的處理方法可以調用:
- $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ù)中提交開始/結束標記來指定要應用于錯誤的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 是結果圖像的所需寬度,以像素為單位。
- $height 是結果圖像的所需高度,以像素為單位。
- $x 是從圖像左側開始裁剪的像素數(shù)。
- $y 是從圖像頂部開始裁剪的像素數(shù)。
- $maintainRatio 如果為true,將根據(jù)需要調整最終尺寸以保持圖像的原始高寬比。
- $masterDim 可使其保持不變的維度,當$maintainRatio為true時。值可以是:’width’,’height’或’auto’。
要從圖像中心取出50x50像素的正方形,你需要首先計算適當?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í)行以下步驟幫助簡化以“智能”方式裁剪圖像的一部分:
- 確定要裁剪的原始圖像的正確部分,以保持所需的寬高比。
- 裁剪原始圖像。
- 調整大小到最終尺寸。
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像素轉換為RGB像素
- 從透明圖像轉換為jpgs格式時指定背景顏色。
flatten(int $red = 255, int $green = 255, int $blue = 255)
- $red 是背景的紅色值。
- $green 是背景的綠色值。
- $blue 是背景的藍色值。
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');
翻轉圖像?
圖像可以沿水平軸或垂直軸翻轉:
flip(string $dir)
- $dir 指定要翻轉的軸??梢允恰按怪薄被颉八健薄?/li>
Services::image('imagick')
->withFile('/path/to/image/mypic.jpg')
->flip('horizontal')
->save('path/to/new/image.jpg');
調整圖像大小?
可以使用resize()方法調整圖像大小以適合你需要的任何維度:
resize(int $width, int $height, bool $maintainRatio = false, string $masterDim = 'auto')
- $width 是新圖像的所需寬度(以像素為單位)
- $height 是新圖像的所需高度(以像素為單位)
- $maintainRatio 確定圖像是否被拉伸以適應新尺寸,或者是否保持原始寬高比。
- $masterDim 指定在保持比率時哪個軸應該具有其維度?!瘜挾取?,’高度’。
調整圖像大小時,你可以選擇是保持原始圖像的比例,還是拉伸/壓縮新圖像以適合所需的尺寸。 如果$maintainRatio為true,則$masterDim指定的尺寸將保持不變,而另一個尺寸將更改為與原始圖像的縱橫比相匹配。
Services::image('imagick')
->withFile('/path/to/image/mypic.jpg')
->resize(200, 100, true, 'height')
->save('path/to/new/image.jpg');
旋轉圖像?
使用 rotate() 方法允許你以90度的增量旋轉圖像:
rotate(float $angle)
- $angle 是要旋轉的度數(shù)。’90’,’180’,’270’之一。
注解
雖然$angle參數(shù)接受float,但它會在進程中將其轉換為整數(shù)。 如果該值不是上面列出的三個值, 他會拋出一個自CodeIgniterImagesImageException的圖像異常錯誤.
添加文本水印?
你可以使用text()方法非常簡單地將文本水印疊加到圖像上。 這對于放置版權聲明,攝影師名稱或簡單地將圖像標記為預覽非常有用,這會使它們最終不會用于其他人的產(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 文本顏色 (十六進制數(shù)字), 即#ff0000
- opacity 設置一個介于0到1之間的數(shù)字,表示文本的不透明度。
- withShadow 以布爾值是否來顯示陰影。
- shadowColor 設定陰影的顏色(十六進制數(shù))。
- shadowOffset 偏移陰影的像素數(shù)。適用于垂直和水平值。
- hAlign 水平對齊:左,中,右
- vAlign 垂直對齊:頂部,中間,底部
- hOffset 指定x軸上的附加偏移,以像素為單位
- vOffset 指定y軸上的附加偏移,以像素為單位
- fontPath 要使用的TTF字體的完整服務器路徑。如果沒有給出系統(tǒng)字體,將使用系統(tǒng)字體。
- fontSize 要使用的字體大小。將GD處理程序與系統(tǒng)字體一起使用時,有效值介于1-5之間。
注解
ImageMagick驅動程序無法識別fontPath的完整服務器路徑。相反,需要你提供希望使用的已安裝系統(tǒng)字體之一的名稱,即如Calibri。