圖像處理類
CodeIgniter 的圖像處理類可以使你完成以下的操作:
- 調(diào)整圖像大小
- 創(chuàng)建縮略圖
- 圖像裁剪
- 圖像旋轉(zhuǎn)
- 添加圖像水印
可以很好的支持三個(gè)主流的圖像庫(kù):GD/GD2, NetPBM, 和 ImageMagick。
注意: 添加水印操作僅僅在使用GD/GD2時(shí)可用。另外,即使支持其他的圖像處理庫(kù),但是為了計(jì)算圖像的屬性,GD是必需的。然而,將使用你制定的庫(kù)來進(jìn)行圖像處理操作。
初始化類
像 CodeIgniter 的大多數(shù)類一樣,圖像處理類在你的控制器里使用 $this->load->library 方法來初始化:
$this->load->library('image_lib');
在圖像處理庫(kù)被載入后就已經(jīng)做好被使用的準(zhǔn)備了。你將用來調(diào)用所有圖像處理方法的圖像處理庫(kù)對(duì)象是:$this->image_lib
處理一個(gè)圖像
不管你想進(jìn)行何種圖像處理操作(調(diào)整大小,圖像裁剪,圖像旋轉(zhuǎn),添加水印),通常過程都是一樣的。你先設(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圖像庫(kù)創(chuàng)建75 X 50像素的縮略圖。 當(dāng) maintain_ratio 選項(xiàng)設(shè)為可用時(shí),生成的縮略圖將在保持縱橫比例的同時(shí),盡可能的在寬度和高度上接近所設(shè)定的width和height??s略圖將被命名為類似 mypic_thumb.jpg的形式
注意: 為了讓圖像類能進(jìn)行所有操作,包含圖片的文件夾必須開啟可寫權(quán)限。
Note: Image processing can require a considerable amount of server memory for some operations. If you are experiencing out of memory errors while processing images you may need to limit their maximum size, and/or adjust PHP memory limits.
處理函數(shù)
有五個(gè)處理函數(shù)可以調(diào)用:
- $this->image_lib->resize()
- $this->image_lib->crop()
- $this->image_lib->rotate()
- $this->image_lib->watermark()
- $this->image_lib->clear()
當(dāng)調(diào)用成功時(shí),這些函數(shù)會(huì)返回 TRUE, 否則會(huì)返回 FALSE. 如果調(diào)用失敗時(shí),用以下函數(shù)可以獲取錯(cuò)誤信息:
echo $this->image_lib->display_errors();
像下面這樣當(dāng)調(diào)用失敗時(shí)顯示錯(cuò)誤,是一個(gè)好的例子來有條件的使用處理函數(shù):
if ( ! $this->image_lib->resize())
{
????echo $this->image_lib->display_errors();
}
注意: 你可以隨意的給錯(cuò)誤使用HTML的格式。像下面這樣,添加打開/關(guān)閉標(biāo)記符:
$this->image_lib->display_errors('<p>', '</p>');
參數(shù)
你可以用下面的參數(shù)來對(duì)圖像處理進(jìn)行調(diào)配,既而滿足你的要求。
注意,不是所有的參數(shù)都可以應(yīng)用到任何得函數(shù)中。例如,x/y 軸參數(shù)只能被圖像裁剪使用。但是,寬度和高度參數(shù)對(duì)裁剪函數(shù)是無效的。 "可用性" 列指明了哪些函數(shù)是可以使用對(duì)應(yīng)的參數(shù)的。
可用性圖列:
- R - 調(diào)整圖像大小
- C - 圖像裁剪
- X - 圖像旋轉(zhuǎn)
- W - 添加圖像水紋
參數(shù) | 默認(rèn)值 | 選項(xiàng) | 描述 | 可用性 |
---|---|---|---|---|
image_library | GD2 | GD, GD2, ImageMagick, NetPBM | 設(shè)置圖像庫(kù) | R, C, X, W |
library_path | 無 | 無 | 設(shè)置 ImageMagick 或 NetPBM 庫(kù)在服務(wù)器上的路徑。要使用其中任何一個(gè),你都需要設(shè)置它們的路徑 | R, C, X |
source_image | 無 | 無 | 設(shè)置原始圖像的名字/路徑。 對(duì)路徑而言,只能是相對(duì)或絕對(duì)的服務(wù)器路徑,不能使用URL。 | R, C, S, W |
dynamic_output | FALSE | TRUE/FALSE (布爾值) | 決定新圖像的生成是要寫入硬盤還是動(dòng)態(tài)的存在。注意,如果是動(dòng)態(tài)生成的話,圖像生成后是不能在頁(yè)面中定位的。它簡(jiǎn)單地以header定義為image的動(dòng)態(tài)圖像形式顯示在你的瀏覽器中。 | R, C, X, W |
quality | 90 | 1 - 100 | 設(shè)置圖像的品質(zhì)。品質(zhì)越高,圖像文件越大 | R, C, X, W |
new_image | None | None | 設(shè)置圖像的目標(biāo)名/路徑。 當(dāng)復(fù)制圖像時(shí),你會(huì)用到這個(gè)參數(shù)的。這個(gè)路徑必須是相對(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ù)產(chǎn)生一個(gè)預(yù)覽圖像 | R |
thumb_marker | _thumb | 無 | 指定預(yù)覽圖像的標(biāo)示。它將在被插入文件擴(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ù)圖片到底是過高還是過長(zhǎng)自動(dòng)設(shè)定軸。 | R |
rotation_angle | None | 90, 180, 270, vrt, hor | 指定圖片旋轉(zhuǎn)的角度。PHP的旋轉(zhuǎn)是逆時(shí)針的,如果想向右轉(zhuǎn)90度就得把這個(gè)參數(shù)定義為270。 | X |
x_axis | None | None | 為圖像的裁剪設(shè)定X軸上的長(zhǎng)度。例如,設(shè)為30就是將圖片左邊的30像素裁去。 | C |
y_axis | None | None | 為圖像的裁剪設(shè)定Y軸上的長(zhǎng)度。例如,設(shè)為30就是將圖片頂端的30像素裁去。 | C |
在配置文件中設(shè)置參數(shù)
如果你不喜歡用以上的方式設(shè)置參數(shù),你還能通過配置文件來設(shè)置它們。只要?jiǎng)?chuàng)建一個(gè)名為image_lib.php的文件, 在該文件中加入一個(gè) $config 數(shù)組。 然后將這個(gè)文件保存到: config/image_lib.php ,它將會(huì)被自動(dòng)調(diào)用。 如果你將參數(shù)保存在配置文件里,你就不需要再使用 $this->image_lib->initialize 函數(shù)。
$this->image_lib->resize()
這個(gè)圖像大小調(diào)整函數(shù)讓你能調(diào)整原始圖像的大小,創(chuàng)建一個(gè)備份(調(diào)整過的和未調(diào)整過的),或者創(chuàng)建一個(gè)縮略圖。
創(chuàng)建一個(gè)備份和創(chuàng)建一個(gè)縮略圖之間沒有實(shí)際上的區(qū)別,除了縮略圖的文件名會(huì)有一個(gè)預(yù)定義的后綴(如, mypic_thumb.jpg)。
所有列在上面表中的參數(shù)對(duì)這個(gè)函數(shù)可用,除了這三個(gè):rotation_angle, x_axis, and 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, and new_image)均未被指定,resize函數(shù)的處理結(jié)果將直接作用于原圖像。
$this->image_lib->crop()
crop函數(shù)的用法與resize函數(shù)十分接近,除了它需要你設(shè)置用于裁剪的X和Y值(單位是像素),如下:
$config['x_axis'] = '100';
$config['y_axis'] = '40';
前面那張表中所列的所有參數(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í)上我們(譯注:指Ellislab公司,CodeIgniter的發(fā)行者)在自己開發(fā)的CMS系統(tǒng)ExpressionEngine的相冊(cè)模塊中添加的一個(gè)基于JavaScript的用戶界面來選擇裁剪的區(qū)域。
$this->image_lib->rotate()
rotate()函數(shù)需要通過參數(shù)設(shè)置旋轉(zhuǎn)的角度:
$config['rotation_angle'] = '90';
以下是5個(gè)可選項(xiàng):
- 90 - 逆時(shí)針旋轉(zhuǎn)90度。
- 180 - 逆時(shí)針旋轉(zhuǎn)180度。
- 270 - 逆時(shí)針旋轉(zhuǎn)270度。
- hor - 水平翻轉(zhuǎn)。
- 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();
}
$this->image_lib->clear()
clear函數(shù)重置所有之前用于處理圖片的值。當(dāng)你用循環(huán)來處理一批圖片時(shí),你可能會(huì)想使用它。
$this->image_lib->clear();
?
圖像水印處理
水印處理功能需要 GD/GD2 庫(kù)的支持.
水印處理的兩種類型
你可以使用以下兩種圖像水印處理方式:
- Text: 水印信息將以文字方式生成,要么使用你所指定的TrueType字體,要么使用GD庫(kù)所支持的內(nèi)部字體。如果你要使用TrueType版本,那么你安裝的GD庫(kù)必須是以支持TrueType的形式編譯的(大多數(shù)時(shí)候是,不是所有)。
- Overlay: 水印信息將以圖像方式生成,新生成的水印圖像(通常是透明的 PNG 或者 GIF)將覆蓋在原圖像上.
水印處理一個(gè)圖像
類似使用其他類型圖像函數(shù)(resizing, cropping, and 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ù)
這個(gè)表里列舉了兩種水印處理 (text or overlay) 的可設(shè)置的參數(shù)
參數(shù) | 默認(rèn)值 | 選項(xiàng) | 描述 |
---|---|---|---|
wm_type | text | text, overlay | 設(shè)置想要使用的水印處理類型. |
source_image | 無 | 無 | 設(shè)置原圖像的名字和路徑. 路徑必須是相對(duì)或絕對(duì)路徑,但不能是URL. |
dynamic_output | FALSE | TRUE/FALSE (布爾值) | 決定新的圖片文件應(yīng)該被寫入磁盤還是動(dòng)態(tài)生成。說明: 如果你選擇動(dòng)態(tài)生成, 那么每次就只能顯示一張圖片, 而且它還不能被定位在頁(yè)面上, 僅僅是把原始圖片動(dòng)態(tài)輸出到瀏覽器中,并且?guī)蟟mage header. |
quality | 90 | 1 - 100 | 設(shè)置圖片的質(zhì)量。數(shù)字越大,質(zhì)量越高, 文件就越大。 |
padding | 無 | 一個(gè)數(shù)字 | 填充量, 以像素為單位, 在實(shí)際應(yīng)用中將被設(shè)置為水印與圖片邊緣的距離。 |
wm_vrt_alignment | bottom | top, middle, bottom | 設(shè)置水印圖像的垂直對(duì)齊方式。 |
wm_hor_alignment | center | left, center, right | 設(shè)置水印圖像的水平對(duì)齊方式。 |
wm_hor_offset | 無 | 無 | 你可以指定一個(gè)水平偏移量(以像素為單位)用于設(shè)置水印的位置。偏移量通常是向右移動(dòng)水印, 除非你把水平對(duì)齊方式設(shè)置為"right", 那么你的偏移量將會(huì)向左移動(dòng)水印。 |
wm_vrt_offset | 無 | 無 | 你可以指定一個(gè)垂直偏移量(以像素為單位)用于設(shè)置水印的位置。偏移量通常是向下移動(dòng)水印, 除非你把垂直對(duì)齊方式設(shè)置為"bottom", 那么你的偏移量將會(huì)向上移動(dòng)水印。 |
Text參數(shù)
這個(gè)表格顯示了Text類型水印的可用參數(shù)。
參數(shù) | 默認(rèn)值 | 選項(xiàng) | 描述 |
---|---|---|---|
wm_text | 無 | 無 | 你想作為水印顯示的文本。通常是一份版權(quán)聲明。 |
wm_font_path | 無 | 無 | 你想使用的TTF字體在服務(wù)器上的路徑。如果你沒有使用這個(gè)選項(xiàng),系統(tǒng)將使用原生的GD字體。 |
wm_font_size | 16 | 無 | 文字的大小。 說明: 如果你沒有使用上面的TTF字體選項(xiàng),那么這個(gè)數(shù)值必須是 1-5 之間的一個(gè)數(shù)字。否則, 你可以使用任意一個(gè)用于你的字體的有效像素大小。 |
wm_font_color | ffffff | 無 | 字體顏色,以十六進(jìn)制給出。注意, 你必須給出完整的6位數(shù)的十六進(jìn)制值(例如993300), 而不是3位數(shù)的簡(jiǎn)化值(例如fff)。 |
wm_shadow_color | 無 | 無 | 陰影的顏色, 以十六進(jìn)制給出。如果此項(xiàng)為空,那么陰影將不會(huì)被使用。注意, 你必須給出完整的6位數(shù)的十六進(jìn)制值(例如993300), 而不是3位數(shù)的簡(jiǎn)化值(例如fff)。 |
wm_shadow_distance | 3 | 無 | 陰影與文字之間的距離(以像素為單位)。 |
Overlay 參數(shù)
這個(gè)表格顯示了Overlay類型水印的可用參數(shù)。
參數(shù) | 默認(rèn)值 | 選項(xiàng) | 描述 |
---|---|---|---|
wm_overlay_path | 無 | 無 | 你想要用作水印的圖片在你服務(wù)器上的路徑。只在你使用了overlay方法時(shí)需要。 |
wm_opacity | 50 | 1 - 100 | 圖像不透明度(opacity)。你可以指定你的水印圖片的不透明度(例如transparency)。這將使水印模糊化,從而不會(huì)掩蓋住底層原始圖片的細(xì)節(jié)。通常設(shè)置為50。 |
wm_x_transp | 4 | 一個(gè)數(shù)字 | 如果你的水印圖片是一個(gè)PNG或GIF圖片, 你可以指定一種顏色用來使圖片變得"透明"。這項(xiàng)設(shè)置(以及下面那項(xiàng))將允許你指定這種顏色。它的原理是, 通過指定"X"和"Y"坐標(biāo)值(從左上方開始測(cè)量)來確定圖片上對(duì)應(yīng)位置的某個(gè)像素, 這個(gè)像素所代表的顏色就是你要設(shè)置為透明的顏色。 |
wm_y_transp | 4 | 一個(gè)數(shù)字 | 與前一個(gè)選項(xiàng)一起, 允許你指定某個(gè)像素的坐標(biāo)值, 這個(gè)像素所代表的顏色就是你要設(shè)置為透明的顏色。 |
?