CodeIgniter 圖像處理類

2018-07-21 15:39 更新

圖像處理類

CodeIgniter 的圖像處理類可以使你完成以下的操作:

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

可以很好的支持三個(gè)主流的圖像庫:GD/GD2、NetPBM 和 ImageMagick 。

注解

添加水印操作僅僅在使用 GD/GD2 時(shí)可用。另外,即使支持其他的圖像處理庫, 但是為了計(jì)算圖像的屬性,GD 仍是必需的。然而在進(jìn)行圖像處理操作時(shí), 還是會(huì)使用你指定的庫。

初始化類

跟 CodeIgniter 中的其他類一樣,可以在你的控制器中使用 $this->load->library() 方法加載圖像處理類:

$this->load->library('image_lib');

一旦加載,圖像處理類就可以像下面這樣使用:

$this->image_lib

處理圖像

不管你想進(jìn)行何種圖像處理操作(調(diào)整大小,圖像裁剪,圖像旋轉(zhuǎn),添加水?。?, 通常過程都是一樣的。你會(huì)先設(shè)置一些你想進(jìn)行的圖像操作的參數(shù), 然后調(diào)用四個(gè)可用方法中的一個(gè)。例如,創(chuàng)建一個(gè)圖像縮略圖:

$config['image_library'] = 'gd2';
$config['source_image'] = '/path/to/image/mypic.jpg';
$config['create_thumb'] = TRUE;
$config['maintain_ratio'] = TRUE;
$config['width']     = 75;
$config['height']   = 50;

$this->load->library('image_lib', $config);

$this->image_lib->resize();

以上代碼告訴 image_resize 函數(shù)去查找位于 source_image 目錄下的名為 mypic.jpg 的圖片,然后運(yùn)用 GD2 圖像庫創(chuàng)建一個(gè) 75 X 50 像素的縮略圖。 當(dāng) maintain_ratio 選項(xiàng)設(shè)為 TRUE 時(shí),生成的縮略圖將保持圖像的縱橫比例,同時(shí)盡可能的在寬度和 高度上接近所設(shè)定的 width 和 height 。 縮略圖將被命名為類似 mypic_thumb.jpg 的形式。

注解

為了讓圖像類能進(jìn)行所有操作,包含圖片的文件夾必須開啟可寫權(quán)限。

注解

圖像處理的某些操作可能需要大量的服務(wù)器內(nèi)存。如果在處理圖像時(shí), 你遇到了內(nèi)存不足錯(cuò)誤,您可能需要限制圖像大小的最大值, 和/或調(diào)整 PHP 的內(nèi)存限制。

處理函數(shù)

有五個(gè)處理函數(shù)可以調(diào)用:

  • $this->image_lib->resize()
  • $this->image_lib->crop()
  • $this->image_lib->rotate()
  • $this->image_lib->watermark()

當(dāng)調(diào)用成功時(shí),這些函數(shù)會(huì)返回 TRUE ,否則會(huì)返回 FALSE 。 如果調(diào)用失敗時(shí),用以下函數(shù)可以獲取錯(cuò)誤信息:

echo $this->image_lib->display_errors();

下面是一個(gè)好的做法,將函數(shù)調(diào)用放在條件判斷里,當(dāng)調(diào)用失敗時(shí)顯示錯(cuò)誤的信息:

if ( ! $this->image_lib->resize())
{
    echo $this->image_lib->display_errors();
}

注解

你也可以給錯(cuò)誤信息指定 HTML 格式,像下面這樣添加起始和結(jié)束標(biāo)簽:

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

參數(shù)

你可以用下面的參數(shù)來對(duì)圖像處理進(jìn)行配置,滿足你的要求。

注意,不是所有的參數(shù)都可以應(yīng)用到每一個(gè)函數(shù)中。例如,x/y 軸參數(shù)只能被圖像裁剪使用。 但是,寬度和高度參數(shù)對(duì)裁剪函數(shù)是無效的。下表的 "可用性" 一欄將指明哪些函數(shù)可以使用對(duì)應(yīng)的參數(shù)。

"可用性" 符號(hào)說明:

  • R - 調(diào)整圖像大小
  • C - 圖像裁剪
  • X - 圖像旋轉(zhuǎn)
  • W - 添加圖像水印
參數(shù) 默認(rèn)值 選項(xiàng) 描述 可用性
image_library GD2 GD, GD2, ImageMagick, NetPBM 設(shè)置要使用的圖像庫 R, C, X, W
library_path None None 設(shè)置 ImageMagick 或 NetPBM 庫在服務(wù)器上的路徑。 要使用它們中的其中任何一個(gè),你都需要設(shè)置它們的路徑。 R, C, X
source_image None None 設(shè)置原始圖像的名稱和路徑。 路徑只能是相對(duì)或絕對(duì)的服務(wù)器路徑,不能使用URL 。 R, C, S, W
dynamic_output FALSE TRUE/FALSE (boolean) 決定新生成的圖像是要寫入硬盤還是內(nèi)存中。 注意,如果是生成到內(nèi)存的話,一次只能顯示一副圖像,而且 不能調(diào)整它在你頁面中的位置,它只是簡單的將圖像數(shù)據(jù)以及圖像的 HTTP 頭發(fā)送到瀏覽器。 R, C, X, W
file_permissions 0644 (integer) 設(shè)置生成圖像文件的權(quán)限。 注意:權(quán)限值為八進(jìn)制表示法。 R, C, X, W
quality 90% 1 - 100% 設(shè)置圖像的品質(zhì)。品質(zhì)越高,圖像文件越大。 R, C, X, W
new_image None None 設(shè)置目標(biāo)圖像的名稱和路徑。 創(chuàng)建圖像副本時(shí)使用該參數(shù),路徑只能是相對(duì)或絕對(duì)的服務(wù)器路徑, 不能使用URL 。 R, C, X, W
width None None 設(shè)置你想要的圖像寬度。 R, C
height None None 設(shè)置你想要的圖像高度。 R, C
create_thumb FALSE TRUE/FALSE (boolean) 告訴圖像處理函數(shù)生成縮略圖。 R
thumb_marker _thumb None 指定縮略圖后綴,它會(huì)被插入到文件擴(kuò)展名的前面, 所以 mypic.jpg 文件會(huì)變成 mypic_thumb.jpg R
maintain_ratio TRUE TRUE/FALSE (boolean) 指定是否在縮放或使用硬值的時(shí)候 使圖像保持原始的縱橫比例。 R, C
master_dim auto auto, width, height 指定一個(gè)選項(xiàng)作為縮放和創(chuàng)建縮略圖時(shí)的主軸。 例如,你想要將一張圖片縮放到 100×75 像素。 如果原來的圖像的大小不能完美的縮放到這個(gè)尺寸, 那么由這個(gè)參數(shù)決定把哪個(gè)軸作為硬值。 "auto" 依據(jù)圖片到底是過高還是過長自動(dòng)設(shè)定軸。 R
rotation_angle None 90, 180, 270, vrt, hor 指定圖片旋轉(zhuǎn)的角度。 注意,旋轉(zhuǎn)是逆時(shí)針的,如果想向右轉(zhuǎn) 90 度, 就得把這個(gè)參數(shù)定義為 270 。 X
x_axis None None 為圖像的裁剪設(shè)定 X 軸上的長度。 例如,設(shè)為 30 就是將圖片左邊的 30 像素裁去。 C
y_axis None None 為圖像的裁剪設(shè)定Y軸上的長度。 例如,設(shè)為30就是將圖片頂端的30像素裁去。 C

在配置文件中設(shè)置參數(shù)

如果你不喜歡使用上面的方法來設(shè)置參數(shù),你可以將參數(shù)保存到配置文件中。你只需簡單的創(chuàng)建一個(gè)文件 image_lib.php 并將 $config 數(shù)組放到該文件中,然后保存文件到 config/image_lib.php ,這些參數(shù)將會(huì)自動(dòng)被使用。 如果你在配置文件中設(shè)置參數(shù),那么你就不需要使用$this->image_lib->initialize() 方法了。

添加圖像水印

水印處理功能需要 GD/GD2 庫的支持。

水印的兩種類型

你可以使用以下兩種圖像水印處理方式:

  • Text:水印信息將以文字方式生成,要么使用你所指定的 TrueType 字體, 要么使用 GD 庫所支持的內(nèi)部字體。如果你要使用 TrueType 版本, 那么你安裝的 GD 庫必須是以支持 TrueType 的形式編譯的(大多數(shù)都是,但不是所有)。
  • Overlay:水印信息將以圖像方式生成,新生成的水印圖像 (通常是透明的 PNG 或者 GIF)將覆蓋在原圖像上。

給圖像添加水印

類似使用其他類型的圖像處理函數(shù)(resizing、cropping 和 rotating), 你也要對(duì)水印處理函數(shù)進(jìn)行參數(shù)設(shè)置來生成你要的結(jié)果,例子如下:

$config['source_image'] = '/path/to/image/mypic.jpg';
$config['wm_text'] = 'Copyright 2006 - John Doe';
$config['wm_type'] = 'text';
$config['wm_font_path'] = './system/fonts/texb.ttf';
$config['wm_font_size'] = '16';
$config['wm_font_color'] = 'ffffff';
$config['wm_vrt_alignment'] = 'bottom';
$config['wm_hor_alignment'] = 'center';
$config['wm_padding'] = '20';

$this->image_lib->initialize($config);

$this->image_lib->watermark();

上面的例子是使用 16 像素 True Type 字體來生成文本水印 "Copyright 2006 - John Doe" , 該水印將出現(xiàn)在離圖像底部 20 像素的中下部位置。

注解

當(dāng)調(diào)用圖像類處理圖像時(shí),所有的目標(biāo)圖片必須有 "寫入" 權(quán)限, 例如:777

水印處理參數(shù)

下表列舉的參數(shù)對(duì)于兩種水印處理方式(text 或 overlay)都適用。

參數(shù) 默認(rèn)值 選項(xiàng) 描述
wm_type text text, overlay 設(shè)置想要使用的水印處理類型。
source_image None None 設(shè)置原圖像的名稱和路徑,路徑必須是相對(duì)或絕對(duì)路徑,不能是 URL 。
dynamic_output FALSE TRUE/FALSE (boolean) 決定新生成的圖像是要寫入硬盤還是內(nèi)存中。 注意,如果是生成到內(nèi)存的話,一次只能顯示一副圖像,而且 不能調(diào)整它在你頁面中的位置,它只是簡單的將圖像數(shù)據(jù)以及圖像的 HTTP 頭發(fā)送到瀏覽器。
quality 90% 1 - 100% 設(shè)置圖像的品質(zhì)。品質(zhì)越高,圖像文件越大。
wm_padding None A number 內(nèi)邊距,以像素為單位,是水印與圖片邊緣之間的距離。
wm_vrt_alignment bottom top, middle, bottom 設(shè)置水印圖像的垂直對(duì)齊方式。
wm_hor_alignment center left, center, right 設(shè)置水印圖像的水平對(duì)齊方式。
wm_hor_offset None None 你可以指定一個(gè)水平偏移量(以像素為單位), 用于設(shè)置水印的位置。偏移量通常是向右移動(dòng)水印, 除非你把水平對(duì)齊方式設(shè)置為 "right" ,那么你的偏移量將會(huì)向左移動(dòng)水印。
wm_vrt_offset None None 你可以指定一個(gè)垂直偏移量(以像素為單位), 用于設(shè)置水印的位置。偏移量通常是向下移動(dòng)水印, 除非你把垂直對(duì)齊方式設(shè)置為 "bottom",那么你的偏移量將會(huì)向上移動(dòng)水印。

Text 參數(shù)

下表列舉的參數(shù)只適用于 text 水印處理方式。

參數(shù) 默認(rèn)值 選項(xiàng) 描述
wm_text None None 你想作為水印顯示的文本。通常是一份版權(quán)聲明。
wm_font_path None None 你想使用的 TTF 字體(TrueType)在服務(wù)器上的路徑。 如果你沒有使用這個(gè)選項(xiàng),系統(tǒng)將使用原生的GD字體。
wm_font_size 16 None 字體大小。 說明:如果你沒有使用上面的 TTF 字體選項(xiàng), 那么這個(gè)數(shù)值必須是 1-5 之間的一個(gè)數(shù)字,如果使用了 TTF , 你可以使用任意有效的字體大小。
wm_font_color ffffff None 字體顏色,以十六進(jìn)制給出。 注意,你必須給出完整的 6 位數(shù)的十六進(jìn)制值(如:993300), 而不能使用 3 位數(shù)的簡化值(如:fff)。
wm_shadow_color None None 陰影的顏色, 以十六進(jìn)制給出。如果此項(xiàng)為空,將不使用陰影。 注意,你必須給出完整的 6 位數(shù)的十六進(jìn)制值(如:993300), 而不能使用 3 位數(shù)的簡化值(如:fff)。
wm_shadow_distance 3 None 陰影與文字之間的距離(以像素為單位)。

Overlay 參數(shù)

下表列舉的參數(shù)只適用于 overlay 水印處理方式。

參數(shù) 默認(rèn)值 選項(xiàng) 描述
wm_overlay_path None None 你想要用作水印的圖片在你服務(wù)器上的路徑。 只在你使用了 overlay 方法時(shí)需要。
wm_opacity 50 1 - 100 圖像不透明度。你可以指定你的水印圖片的不透明度。 這將使水印模糊化,從而不會(huì)掩蓋住底層原始圖片,通常設(shè)置為 50 。
wm_x_transp 4 A number 如果你的水印圖片是一個(gè) PNG 或 GIF 圖片, 你可以指定一種顏色用來使圖片變得 "透明" 。這項(xiàng)設(shè)置 (以及下面那項(xiàng))將允許你指定這種顏色。它的原理是,通過指定 "X" 和 "Y" 坐標(biāo)值(從左上方開始測(cè)量)來確定圖片上對(duì)應(yīng)位置的某個(gè)像素, 這個(gè)像素所代表的顏色就是你要設(shè)置為透明的顏色。
wm_y_transp 4 A number 與前一個(gè)選項(xiàng)一起,允許你指定某個(gè)像素的坐標(biāo)值, 這個(gè)像素所代表的顏色就是你要設(shè)置為透明的顏色。

類參考

classCI_Image_lib

initialize([$props = array()])

參數(shù):

  • $props (array) -- Image processing preferences

返回: TRUE on success, FALSE in case of invalid settings

返回類型: bool

初始化圖像處理類。

resize()

返回: TRUE on success, FALSE on failure
返回類型: bool

該函數(shù)讓你能調(diào)整原始圖像的大小,創(chuàng)建一個(gè)副本(調(diào)整或未調(diào)整過的), 或者創(chuàng)建一個(gè)縮略圖。

創(chuàng)建一個(gè)副本和創(chuàng)建一個(gè)縮略圖之間沒有實(shí)際上的區(qū)別, 除了縮略圖的文件名會(huì)有一個(gè)自定義的后綴(如:mypic_thumb.jpg)。

所有列在上面 參數(shù) 表中的參數(shù)對(duì)這個(gè)函數(shù)都可用, 除了這三個(gè): rotation_angle 、 x_axis 和 y_axis 。

創(chuàng)建一個(gè)縮略圖

resize 函數(shù)能用來創(chuàng)建縮略圖(并保留原圖),只要你把這個(gè)參數(shù)設(shè)為 TRUE

$config['create_thumb'] = TRUE;

這一個(gè)參數(shù)決定是否創(chuàng)建一個(gè)縮略圖。

創(chuàng)建一個(gè)副本

resize 函數(shù)能創(chuàng)建一個(gè)圖像的副本(并保留原圖), 只要你通過以下參數(shù)設(shè)置一個(gè)新的路徑或者文件名:

$config['new_image'] = '/path/to/new_image.jpg';

注意以下規(guī)則:

  • 如果只指定新圖像的名字,那么它會(huì)被放在原圖像所在的文件夾下。
  • 如果只指定路徑,新圖像會(huì)被放在指定的文件夾下,并且名字和原圖像相同。
  • 如果同時(shí)定義了路徑和新圖像的名字,那么新圖像會(huì)以指定的名字放在指定的文件夾下。

調(diào)整原圖像的大小

如果上述兩個(gè)參數(shù)(create_thumb 和 new_image)均未被指定, resize 函數(shù)的處理將直接作用于原圖像。

crop()

返回: TRUE on success, FALSE on failure
返回類型: bool

crop 函數(shù)的用法與 resize 函數(shù)十分接近,除了它需要你設(shè)置用于裁剪的 X 和 Y 值 (單位是像素),如下:

$config['x_axis'] = 100;
$config['y_axis'] = 40;

前面那張 參數(shù) 表中所列的所有參數(shù)都可以用于這個(gè)函數(shù), 除了這些:rotation_angle 、width 、height 、create_thumb 、new_image 。

這是一個(gè)如何裁剪一張圖片的示例:

$config['image_library'] = 'imagemagick';
$config['library_path'] = '/usr/X11R6/bin/';
$config['source_image'] = '/path/to/image/mypic.jpg';
$config['x_axis'] = 100;
$config['y_axis'] = 60;

$this->image_lib->initialize($config);

if ( ! $this->image_lib->crop())
{
    echo $this->image_lib->display_errors();
}

注解

如果沒有一個(gè)可視化的界面,是很難裁剪一張圖片的。 因此,除非你打算制作這么一個(gè)界面,否則這個(gè)函數(shù)并不是很有用。 事實(shí)上我們?cè)谧约洪_發(fā)的 CMS 系統(tǒng) ExpressionEngine 的相冊(cè)模塊中 添加的一個(gè)基于 JavaScript 的用戶界面來選擇裁剪的區(qū)域。

rotate()

返回: TRUE on success, FALSE on failure
返回類型: bool

rotate 函數(shù)需要通過參數(shù)設(shè)置旋轉(zhuǎn)的角度:

$config['rotation_angle'] = '90';

以下是 5 個(gè)可選項(xiàng):

  1. 90 - 逆時(shí)針旋轉(zhuǎn)90度。
  2. 180 - 逆時(shí)針旋轉(zhuǎn)180度。
  3. 270 - 逆時(shí)針旋轉(zhuǎn)270度。
  4. hor - 水平翻轉(zhuǎn)。
  5. vrt - 垂直翻轉(zhuǎn)。

下面是旋轉(zhuǎn)圖片的一個(gè)例子:

$config['image_library'] = 'netpbm';
$config['library_path'] = '/usr/bin/';
$config['source_image'] = '/path/to/image/mypic.jpg';
$config['rotation_angle'] = 'hor';

$this->image_lib->initialize($config);

if ( ! $this->image_lib->rotate())
{
    echo $this->image_lib->display_errors();
}

watermark()

返回: TRUE on success, FALSE on failure
返回類型: bool

在圖像上添加一個(gè)水印,更多信息請(qǐng)參考 給圖像添加水印 。

clear()

返回類型: void

clear 函數(shù)重置所有之前用于處理圖片的值。當(dāng)你用循環(huán)來處理一批圖片時(shí),你可能會(huì)想使用它。

$this->image_lib->clear();

display_errors([$open = '[, $close = '']])

參數(shù):

  • $open (string) -- Error message opening tag
  • $close (string) -- Error message closing tag

返回: Error messages

返回類型: string

返回所有檢測(cè)到的錯(cuò)誤信息。

echo $this->image_lib->diplay_errors();
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)