圖像處理類?
CodeIgniter的圖像處理類允許你執(zhí)行以下操作:
- 圖像大小調(diào)整
- 創(chuàng)建縮略圖
- 圖像裁剪
- 圖像旋轉(zhuǎn)
- 圖像水印
圖像處理類支持使用以下圖像庫(kù):GD/GD2和 ImageMagick
初始化類?
與CodeIgniter中的大多數(shù)其他類一樣,你可以通過(guò)控制器中調(diào)用Services類的初始化圖像處理類:
$image = Config\Services::image();
你可以將要使用的圖像庫(kù)的別名傳遞給服務(wù)功能:
$image = Config\Services::image('imagick');
可用的圖像庫(kù)處理程序如下:
- gd 對(duì)應(yīng)調(diào)用的是GD/GD2圖像庫(kù)。
- imagick 對(duì)應(yīng)調(diào)用的是ImageMagick圖像庫(kù)。
如果你要使用ImageMagick圖像庫(kù),則必須要在 application/Config/Images.php 中設(shè)置服務(wù)器上該庫(kù)的所在路徑。
注解
ImageMagick處理程序不需要在服務(wù)器上加載imagick擴(kuò)展。只要你的腳本可以訪問(wèn)該庫(kù)并且可以使用 exec() 運(yùn)行在服務(wù)器上,它就可以工作。
處理圖像?
無(wú)論你執(zhí)行何種圖像的處理方法函數(shù)(調(diào)整大小、裁剪、旋轉(zhuǎn)、使用水印),一般調(diào)用過(guò)程都是相同的。 你將根據(jù)要執(zhí)行的操作設(shè)置一些首選項(xiàng),然后調(diào)用其中一個(gè)你需要的使用的可用處理函數(shù):
$image = Config\Services::image()
->withFile('/path/to/image/mypic.jpg')
->fit(100, 100, 'center')
->save('/path/to/image/mypic_thumb.jpg');
上面的代碼告我們它會(huì)查找來(lái)自image文件夾中的名為*mypic.jpg*的圖像,然后使用GD2 image_library圖像庫(kù)來(lái)創(chuàng)建一個(gè)100 x 100像素的新圖像,并將其保存到新文件(the thumb)。 由于它使用fit()方法,它將嘗試根據(jù)所需的寬高比找到要裁剪的圖像的最佳部分,然后裁剪并調(diào)整結(jié)果大小。
在保存新圖像之前,可以根據(jù)需求來(lái)通過(guò)許多可用方法來(lái)處理圖像。原始圖像將保持原樣,而新圖像會(huì)通過(guò)每個(gè)方法傳參,將處理結(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ù)任何移動(dòng)電話的定向問(wèn)題,圖像將旋轉(zhuǎn)90度,然后從左上角開始將結(jié)果裁剪為100x100像素圖像。結(jié)果將保存成縮略圖。
注解
為了讓圖像處理類可以進(jìn)行任何處理,包含圖像文件的文件夾必須具有寫入權(quán)限。
注解
對(duì)于某些操作,圖像處理時(shí)可能需要相當(dāng)大量的服務(wù)器內(nèi)存。如果在處理圖像時(shí)遇到內(nèi)存不足錯(cuò)誤,可能需要限制其圖像的最大大小,和/或調(diào)整PHP內(nèi)存限制。
處理方法?
有六種可用的處理方法可以調(diào)用:
- $image->crop()
- $image->fit()
- $image->flatten()
- $image->flip()
- $image->resize()
- $image->rotate()
- $image->text()
這些方法將會(huì)返回類實(shí)例,如上所示,它們可以鏈接在一起。如果失敗,它們將拋出包含錯(cuò)誤的消息到 CodeIgniter\Images\ImageException 。
一個(gè)好的做法是捕獲異常消息,在失敗時(shí)顯示錯(cuò)誤,如下所示:
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();
}
注解
你可以選擇通過(guò)在函數(shù)中提交開始/結(jié)束標(biāo)記來(lái)指定要應(yīng)用于錯(cuò)誤的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è)開始裁剪的像素?cái)?shù)。
- $y 是從圖像頂部開始裁剪的像素?cái)?shù)。
- $maintainRatio 如果為true,將根據(jù)需要調(diào)整最終尺寸以保持圖像的原始高寬比。
- $masterDim 可使其保持不變的維度,當(dāng)$maintainRatio為true時(shí)。值可以是:’width’,’height’或’auto’。
要從圖像中心取出50x50像素的正方形,你需要首先計(jì)算適當(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() 方法旨在通過(guò)執(zhí)行以下步驟幫助簡(jiǎn)化以“智能”方式裁剪圖像的一部分:
- 確定要裁剪的原始圖像的正確部分,以保持所需的寬高比。
- 裁剪原始圖像。
- 調(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’。
這里提供一種更簡(jiǎn)單的裁剪方式,可以始終保持縱橫比:
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格式時(shí)指定背景顏色。
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 指定在保持比率時(shí)哪個(gè)軸應(yīng)該具有其維度?!瘜挾取?,’高度’。
調(diào)整圖像大小時(shí),你可以選擇是保持原始圖像的比例,還是拉伸/壓縮新圖像以適合所需的尺寸。 如果$maintainRatio為true,則$masterDim指定的尺寸將保持不變,而另一個(gè)尺寸將更改為與原始圖像的縱橫比相匹配。
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,但它會(huì)在進(jìn)程中將其轉(zhuǎn)換為整數(shù)。 如果該值不是上面列出的三個(gè)值, 他會(huì)拋出一個(gè)自CodeIgniterImagesImageException的圖像異常錯(cuò)誤.
添加文本水印?
你可以使用text()方法非常簡(jiǎn)單地將文本水印疊加到圖像上。 這對(duì)于放置版權(quán)聲明,攝影師名稱或簡(jiǎn)單地將圖像標(biāo)記為預(yù)覽非常有用,這會(huì)使它們最終不會(huì)用于其他人的產(chǎn)品上。
text(string $text, array $options = [])
第一個(gè)參數(shù)是你要顯示的文本字符串。第二個(gè)參數(shù)是一個(gè)選項(xiàng)數(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');
可識(shí)別的選項(xiàng)如下:
- color 文本顏色 (十六進(jìn)制數(shù)字), 即#ff0000
- opacity 設(shè)置一個(gè)介于0到1之間的數(shù)字,表示文本的不透明度。
- withShadow 以布爾值是否來(lái)顯示陰影。
- shadowColor 設(shè)定陰影的顏色(十六進(jìn)制數(shù))。
- shadowOffset 偏移陰影的像素?cái)?shù)。適用于垂直和水平值。
- hAlign 水平對(duì)齊:左,中,右
- vAlign 垂直對(duì)齊:頂部,中間,底部
- hOffset 指定x軸上的附加偏移,以像素為單位
- vOffset 指定y軸上的附加偏移,以像素為單位
- fontPath 要使用的TTF字體的完整服務(wù)器路徑。如果沒有給出系統(tǒng)字體,將使用系統(tǒng)字體。
- fontSize 要使用的字體大小。將GD處理程序與系統(tǒng)字體一起使用時(shí),有效值介于1-5之間。
注解
ImageMagick驅(qū)動(dòng)程序無(wú)法識(shí)別fontPath的完整服務(wù)器路徑。相反,需要你提供希望使用的已安裝系統(tǒng)字體之一的名稱,即如Calibri。