ThinkPHP官方為大家常用圖像處理提供了一個Image類,大家下載完整包,就能看到`/ThinkPHP/Library/Think/Image.class.php` 這個類文件。
使用Think\Image類進行圖像處理功能,支持Gd庫和Imagick庫,包括對GIf圖像處理的支持。
> 使用Imagick庫 一定要確保該擴展可用哦,像coding.net演示是安裝可以通過配置支持的。
## 實例化類庫
~~~
$image = new \Think\Image();
~~~
默認使用GD庫進行圖像操作,如果需要使用Imagick庫操作的話,需要改成:
~~~
$image = new \Think\Image(\Think\Image::IMAGE_IMAGICK);
// 或者采用
$image = new \Think\Image('Imagick');
~~~
## 圖像操作
下面來看下基礎的圖像操作功能的使用方法。
### 打開圖像文件
假設當前入口文件目錄下面有一個1.jpg文件,如圖所示:

使用open方法打開圖像文件進行相關操作:
~~~
$image = new \Think\Image();
$image->open('./1.jpg');
~~~
也可以簡化成下面的方式:
~~~
$image = new \Think\Image(\Think\Image::IMAGE_GD,'./1.jpg'); // GD庫
// 或者
$image = new \Think\Image(\Think\Image::IMAGE_IMAGICK,'./1.jpg'); // imagick庫
~~~
### 獲取圖像信息
可以獲取打開圖片的信息,包括圖像大小、類型等,例如:
~~~
$image = new \Think\Image();
$image->open('./1.jpg');
$width = $image->width(); // 返回圖片的寬度
$height = $image->height(); // 返回圖片的高度
$type = $image->type(); // 返回圖片的類型
$mime = $image->mime(); // 返回圖片的mime類型
$size = $image->size(); // 返回圖片的尺寸數組 0 圖片寬度 1 圖片高度
~~~
### 裁剪圖片
使用crop和save方法完成裁剪圖片功能。
~~~
$image = new \Think\Image();
$image->open('./1.jpg');
//將圖片裁剪為400x400并保存為corp.jpg
$image->crop(400, 400)->save('./crop.jpg');
~~~
生成的圖片如圖:

支持從某個坐標開始裁剪,例如下面從(100,30)開始裁剪:
~~~
$image = new \Think\Image();
$image->open('./1.jpg');
//將圖片裁剪為400x400并保存為corp.jpg
$image->crop(400, 400,100,30)->save('./crop.jpg');
~~~
生成的圖片如圖:

### 生成縮略圖
使用thumb方法生成縮略圖
~~~
$image = new \Think\Image();
$image->open('./1.jpg');
// 按照原圖的比例生成一個最大為150*150的縮略圖并保存為thumb.jpg
$image->thumb(150, 150)->save('./thumb.jpg');
~~~
生成的縮略圖如圖所示:

我們看到實際生成的縮略圖并不是150*150,因為默認采用原圖等比例縮放的方式生成縮略圖,最大寬度是150。
可以支持其他類型的縮略圖生成,設置包括Think\Image的下列常量或者對應的數字:
~~~
IMAGE_THUMB_SCALE = 1 ; //等比例縮放類型
IMAGE_THUMB_FILLED = 2 ; //縮放后填充類型
IMAGE_THUMB_CENTER = 3 ; //居中裁剪類型
IMAGE_THUMB_NORTHWEST = 4 ; //左上角裁剪類型
IMAGE_THUMB_SOUTHEAST = 5 ; //右下角裁剪類型
IMAGE_THUMB_FIXED = 6 ; //固定尺寸縮放類型
~~~
例如:
#### 居中裁剪
~~~
$image = new \Think\Image();
$image->open('./1.jpg');
// 生成一個居中裁剪為150*150的縮略圖并保存為thumb.jpg
$image->thumb(150, 150,\Think\Image::IMAGE_THUMB_CENTER)->save('./thumb.jpg');
~~~
居中裁剪后生成的縮略圖效果如圖:

#### 左上角剪裁
~~~
$image = new \Think\Image();
$image->open('./1.jpg');
// 生成一個左上角裁剪為150*150的縮略圖并保存為thumb.jpg
$image->thumb(150, 150,\Think\Image::IMAGE_THUMB_NORTHWEST)->save('./thumb.jpg');
~~~
左上角裁剪后生成的縮略圖效果如圖:

#### 縮放填充
~~~
$image = new \Think\Image();
$image->open('./1.jpg');
// 生成一個縮放后填充大小150*150的縮略圖并保存為thumb.jpg
$image->thumb(150, 150,\Think\Image::IMAGE_THUMB_FILLED)->save('./thumb.jpg');
~~~
縮放填充后生成的縮略圖效果如圖:

#### 固定大小
~~~
$image = new \Think\Image();
$image->open('./1.jpg');
// 生成一個固定大小為150*150的縮略圖并保存為thumb.jpg
$image->thumb(150, 150,\Think\Image::IMAGE_THUMB_FIXED)->save('./thumb.jpg');
~~~
采用固定大小的縮略圖可能會有所變形,生成的縮略圖效果如圖:

### 添加圖片水印
~~~
$image = new \Think\Image();
$image->open('./1.jpg');
//將圖片裁剪為440x440并保存為corp.jpg
$image->crop(440, 440)->save('./crop.jpg');
// 給裁剪后的圖片添加圖片水印(水印文件位于./logo.png),位置為右下角,保存為water.gif
$image->water('./logo.png')->save("water.gif");
// 給原圖添加水印并保存為water_o.gif(需要重新打開原圖)
$image->open('./1.jpg')->water('./logo.png')->save("water_o.gif");
~~~
water方法的第二個參數表示水印的位置,可以傳入下列Think\Imag類的常量或者對應的數字:
~~~
IMAGE_WATER_NORTHWEST = 1 ; //左上角水印
IMAGE_WATER_NORTH = 2 ; //上居中水印
IMAGE_WATER_NORTHEAST = 3 ; //右上角水印
IMAGE_WATER_WEST = 4 ; //左居中水印
IMAGE_WATER_CENTER = 5 ; //居中水印
IMAGE_WATER_EAST = 6 ; //右居中水印
IMAGE_WATER_SOUTHWEST = 7 ; //左下角水印
IMAGE_WATER_SOUTH = 8 ; //下居中水印
IMAGE_WATER_SOUTHEAST = 9 ; //右下角水印
~~~
例如:
~~~
$image = new \Think\Image();
// 在圖片左上角添加水印(水印文件位于./logo.png) 并保存為water.jpg
$image->open('./1.jpg')->water('./logo.png',\Think\Image::IMAGE_WATER_NORTHWEST)->save("water.jpg");
~~~
生成的圖片效果如下:

還可以支持水印圖片的透明度(0~100,默認值是80),例如:
~~~
$image = new \Think\Image();
// 在圖片左上角添加水印(水印文件位于./logo.png) 水印圖片的透明度為50 并保存為water.jpg
$image->open('./1.jpg')->water('./logo.png',\Think\Image::IMAGE_WATER_NORTHWEST,50)->save("water.jpg");
~~~
生成的效果如下:

也可以支持給圖片添加文字水印(假設在入口文件的同級目錄下存在1.ttf字體文件),例如:
~~~
$image = new \Think\Image();
// 在圖片右下角添加水印文字 ThinkPHP 并保存為new.jpg
$image->open('./1.jpg')->text('ThinkPHP','./1.ttf',20,'#000000',\Think\Image::IMAGE_WATER_SOUTHEAST)->save("new.jpg");
~~~
生成的圖片效果:

- 序
- 前言
- 內容簡介
- 目錄
- 基礎知識
- 起步
- 控制器
- 模型
- 模板
- 命名空間
- 進階知識
- 路由
- 配置
- 緩存
- 權限
- 擴展
- 國際化
- 安全
- 單元測試
- 拿來主義
- 調試方法
- 調試的步驟
- 調試工具
- 顯示trace信息
- 開啟調試和關閉調試的區別
- netbeans+xdebug
- Socketlog
- PHP常見錯誤
- 小黃鴨調試法,每個程序員都要知道的
- 應用場景
- 第三方登錄
- 圖片處理
- 博客
- SAE
- REST實踐
- Cli
- ajax分頁
- barcode條形碼
- excel
- 發郵件
- 漢字轉全拼和首字母,支持帶聲調
- 中文分詞
- 瀏覽器useragent解析
- freelog項目實戰
- 需求分析
- 數據庫設計
- 編碼實踐
- 前端實現
- rest接口
- 文章發布
- 文件上傳
- 視頻播放
- 音樂播放
- 圖片幻燈片展示
- 注冊和登錄
- 個人資料更新
- 第三方登錄的使用
- 后臺
- 微信的開發
- 首頁及個人主頁
- 列表
- 歸檔
- 搜索
- 分頁
- 總結經驗
- 自我提升
- 進行小項目的鍛煉
- 對現有輪子的重構和移植
- 寫技術博客
- 制作視頻教程
- 學習PHP的知識和新特性
- 和同行直接溝通、交流
- 學好英語,走向國際
- 如何參與
- 瀏覽官網和極思維還有看云
- 回答ThinkPHP新手的問題
- 嘗試發現ThinkPHP的bug,告訴官方人員或者push request
- 開發能提高效率的ThinkPHP工具
- 嘗試翻譯官方文檔
- 幫新手入門
- 創造基于ThinkPHP的產品,進行連帶推廣
- 展望未來
- OneThink
- ThinkPHP4
- 附錄