# 圖像處理
我們繼續前面的文件上傳部分,并調用圖像擴展類庫對上傳的圖像文件進行相關的處理和保存。
- - [安裝擴展](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/179623#u5B89u88C5u6269u5C55)
- [示例代碼](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/179623#u793Au4F8Bu4EE3u7801)
- [控制器定義](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/179623#u63A7u5236u5668u5B9Au4E49)
- [模板定義](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/179623#u6A21u677Fu5B9Au4E49)
- [示例演示](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/179623#u793Au4F8Bu6F14u793A)
- [讀取圖片](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/179623#u8BFBu53D6u56FEu7247)
- [圖片裁剪](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/179623#u56FEu7247u88C1u526A)
- [生成縮略圖](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/179623#u751Fu6210u7F29u7565u56FE)
- [圖像翻轉](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/179623#u56FEu50CFu7FFBu8F6C)
- [圖片旋轉](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/179623#u56FEu7247u65CBu8F6C)
- [添加水印](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/179623#u6DFBu52A0u6C34u5370)
- [文字水印](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/179623#u6587u5B57u6C34u5370)
- [圖片保存](http://www.hmoore.net/thinkphp/thinkphp5_quickstart/179623#u56FEu7247u4FDDu5B58)
## 安裝擴展
首先使用`Composer`安裝`ThinkPHP5`的圖像處理類庫:
```
<pre class="calibre18">
```
composer <span class="hljs-keyword">require</span> topthink/think-image
```
```
## 示例代碼
本示例使用下面的示例代碼進行圖片上傳和處理。
### 控制器定義
然后修改之前創建的`Upload`控制器,添加`picture`方法如下:
```
<pre class="calibre18">
```
<span class="hljs-operator"><span class="hljs-number"><?php</span><span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">index</span>\<span class="hljs-title">controller</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">Image</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">think</span>\<span class="hljs-title">Request</span>;
<span class="hljs-operator"><span class="hljs-keyword">class</span> <span class="hljs-title">Upload</span> <span class="hljs-keyword">extends</span> \<span class="hljs-title">think</span>\<span class="hljs-title">Controller</span></span>{
<span class="hljs-comment">// 文件上傳表單</span><span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">index</span><span class="hljs-number">()</span></span>{
<span class="hljs-keyword">return</span> <span class="hljs-regexp">$this</span>->fetch();
}
<span class="hljs-comment">// 圖片上傳處理</span><span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">picture</span><span class="hljs-number">(Request <span class="hljs-regexp">$request</span>)</span></span>{
<span class="hljs-comment">// 獲取表單上傳文件</span><span class="hljs-regexp">$file</span> = <span class="hljs-regexp">$request</span>->file(<span class="hljs-string">'image'</span>);
<span class="hljs-keyword">if</span> (<span class="hljs-keyword">true</span> !== <span class="hljs-regexp">$this</span>->validate([<span class="hljs-string">'image'</span> => <span class="hljs-regexp">$file</span>], [<span class="hljs-string">'image'</span> => <span class="hljs-string">'require|image'</span>])) {
<span class="hljs-regexp">$this</span>->error(<span class="hljs-string">'請選擇圖像文件'</span>);
} <span class="hljs-keyword">else</span> {
<span class="hljs-comment">// 讀取圖片</span><span class="hljs-regexp">$image</span> = Image::open(<span class="hljs-regexp">$file</span>);
<span class="hljs-comment">// 圖片處理</span><span class="hljs-keyword">switch</span> (<span class="hljs-regexp">$request</span>->param(<span class="hljs-string">'type'</span>)) {
<span class="hljs-keyword">case</span> <span class="hljs-number">1</span>: <span class="hljs-comment">// 圖片裁剪</span><span class="hljs-regexp">$image</span>->crop(<span class="hljs-number">300</span>, <span class="hljs-number">300</span>);
<span class="hljs-keyword">break</span>;
<span class="hljs-keyword">case</span> <span class="hljs-number">2</span>: <span class="hljs-comment">// 縮略圖</span><span class="hljs-regexp">$image</span>->thumb(<span class="hljs-number">150</span>, <span class="hljs-number">150</span>, Image::THUMB_CENTER);
<span class="hljs-keyword">break</span>;
<span class="hljs-keyword">case</span> <span class="hljs-number">3</span>: <span class="hljs-comment">// 垂直翻轉</span><span class="hljs-regexp">$image</span>->flip();
<span class="hljs-keyword">break</span>;
<span class="hljs-keyword">case</span> <span class="hljs-number">4</span>: <span class="hljs-comment">// 水平翻轉</span><span class="hljs-regexp">$image</span>->flip(Image::FLIP_Y);
<span class="hljs-keyword">break</span>;
<span class="hljs-keyword">case</span> <span class="hljs-number">5</span>: <span class="hljs-comment">// 圖片旋轉</span><span class="hljs-regexp">$image</span>->rotate();
<span class="hljs-keyword">break</span>;
<span class="hljs-keyword">case</span> <span class="hljs-number">6</span>: <span class="hljs-comment">// 圖片水印</span><span class="hljs-regexp">$image</span>->water(<span class="hljs-string">'./logo.png'</span>, Image::WATER_NORTHWEST, <span class="hljs-number">50</span>);
<span class="hljs-keyword">break</span>;
<span class="hljs-keyword">case</span> <span class="hljs-number">7</span>: <span class="hljs-comment">// 文字水印</span><span class="hljs-regexp">$image</span>->text(<span class="hljs-string">'ThinkPHP'</span>, VENDOR_PATH . <span class="hljs-string">'topthink/think-captcha/assets/ttfs/1.ttf'</span>, <span class="hljs-number">20</span>, <span class="hljs-string">'#ffffff'</span>);
<span class="hljs-keyword">break</span>;
}
<span class="hljs-comment">// 保存圖片(以當前時間戳)</span><span class="hljs-regexp">$saveName</span> = <span class="hljs-regexp">$request</span>->time() . <span class="hljs-string">'.png'</span>;
<span class="hljs-regexp">$image</span>->save(ROOT_PATH . <span class="hljs-string">'public/uploads/'</span> . <span class="hljs-regexp">$saveName</span>);
<span class="hljs-regexp">$this</span>->success(<span class="hljs-string">'圖片處理完畢...'</span>, <span class="hljs-string">'/uploads/'</span> . <span class="hljs-regexp">$saveName</span>, <span class="hljs-number">1</span>);
}
}
}</span>
```
```
### 模板定義
配合控制器的上傳頁面模板修改為:
```
<pre class="calibre18">
```
<span class="hljs-regexp"><!doctype html></span><span class="hljs-regexp"><<span class="hljs-operator">html</span>></span><span class="hljs-regexp"><<span class="hljs-operator">head</span>></span><span class="hljs-regexp"><<span class="hljs-operator">meta</span> <span class="hljs-operator">charset</span>=<span class="hljs-string">"UTF-8"</span>></span><span class="hljs-regexp"><<span class="hljs-operator">title</span>></span>圖像上傳和處理示例<span class="hljs-regexp"></<span class="hljs-operator">title</span>></span><span class="hljs-regexp"><<span class="hljs-operator">style</span>></span><span class="css"><span class="hljs-regexp">body</span> <span class="hljs-operator">{
<span class="hljs-operator"><span class="hljs-title1">font-family</span>:<span class="hljs-string"><span class="hljs-operator">"Microsoft Yahei"</span>,<span class="hljs-operator">"Helvetica Neue"</span>,Helvetica,Arial,sans-serif</span></span>;
<span class="hljs-operator"><span class="hljs-title1">font-size</span>:<span class="hljs-string"><span class="hljs-number">16px</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">padding</span>:<span class="hljs-string"><span class="hljs-number">5px</span></span></span>;
}</span><span class="hljs-regexp">.form</span><span class="hljs-operator">{
<span class="hljs-operator"><span class="hljs-title1">padding</span>:<span class="hljs-string"> <span class="hljs-number">15px</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">font-size</span>:<span class="hljs-string"> <span class="hljs-number">16px</span></span></span>;
}</span><span class="hljs-regexp">.form</span> <span class="hljs-regexp">.text</span> <span class="hljs-operator">{
<span class="hljs-operator"><span class="hljs-title1">padding</span>:<span class="hljs-string"> <span class="hljs-number">3px</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">margin</span>:<span class="hljs-string"><span class="hljs-number">2px</span> <span class="hljs-number">10px</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">width</span>:<span class="hljs-string"> <span class="hljs-number">240px</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">height</span>:<span class="hljs-string"> <span class="hljs-number">24px</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">line-height</span>:<span class="hljs-string"> <span class="hljs-number">28px</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">border</span>:<span class="hljs-string"> <span class="hljs-number">1px</span> solid <span class="hljs-title">#D4D4D4</span></span></span>;
}</span><span class="hljs-regexp">.form</span> <span class="hljs-regexp">select</span> <span class="hljs-operator">{
<span class="hljs-operator"><span class="hljs-title1">padding</span>:<span class="hljs-string"> <span class="hljs-number">5px</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">margin</span>:<span class="hljs-string"><span class="hljs-number">2px</span> <span class="hljs-number">10px</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">width</span>:<span class="hljs-string"> <span class="hljs-number">150px</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">height</span>:<span class="hljs-string"> <span class="hljs-number">30px</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">line-height</span>:<span class="hljs-string"> <span class="hljs-number">30px</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">border</span>:<span class="hljs-string"> <span class="hljs-number">1px</span> solid <span class="hljs-title">#D4D4D4</span></span></span>;
}</span><span class="hljs-regexp">.form</span> <span class="hljs-regexp">.btn</span><span class="hljs-operator">{
<span class="hljs-operator"><span class="hljs-title1">margin</span>:<span class="hljs-string"><span class="hljs-number">6px</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">padding</span>:<span class="hljs-string"> <span class="hljs-number">6px</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">width</span>:<span class="hljs-string"> <span class="hljs-number">120px</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">font-size</span>:<span class="hljs-string"> <span class="hljs-number">16px</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">border</span>:<span class="hljs-string"> <span class="hljs-number">1px</span> solid <span class="hljs-title">#D4D4D4</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">cursor</span>:<span class="hljs-string"> pointer</span></span>;
<span class="hljs-operator"><span class="hljs-title1">background</span>:<span class="hljs-string"><span class="hljs-title">#eee</span></span></span>;
}</span><span class="hljs-regexp">.form</span> <span class="hljs-regexp">.file</span><span class="hljs-operator">{
<span class="hljs-operator"><span class="hljs-title1">margin</span>:<span class="hljs-string"><span class="hljs-number">6px</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">padding</span>:<span class="hljs-string"> <span class="hljs-number">6px</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">width</span>:<span class="hljs-string"> <span class="hljs-number">220px</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">font-size</span>:<span class="hljs-string"> <span class="hljs-number">16px</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">border</span>:<span class="hljs-string"> <span class="hljs-number">1px</span> solid <span class="hljs-title">#D4D4D4</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">cursor</span>:<span class="hljs-string"> pointer</span></span>;
<span class="hljs-operator"><span class="hljs-title1">background</span>:<span class="hljs-string"><span class="hljs-title">#eee</span></span></span>;
}</span><span class="hljs-regexp">a</span><span class="hljs-operator">{
<span class="hljs-operator"><span class="hljs-title1">color</span>:<span class="hljs-string"> <span class="hljs-title">#868686</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">cursor</span>:<span class="hljs-string"> pointer</span></span>;
}</span><span class="hljs-operator"><span class="hljs-title1">a</span>:<span class="hljs-string">hover{
text-decoration: underline</span></span>;
}
<span class="hljs-regexp">h2</span><span class="hljs-operator">{
<span class="hljs-operator"><span class="hljs-title1">color</span>:<span class="hljs-string"> <span class="hljs-title">#4288ce</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">font-weight</span>:<span class="hljs-string"> <span class="hljs-number">400</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">padding</span>:<span class="hljs-string"> <span class="hljs-number">6px</span> <span class="hljs-number">0</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">margin</span>:<span class="hljs-string"> <span class="hljs-number">6px</span> <span class="hljs-number">0</span> <span class="hljs-number">0</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">font-size</span>:<span class="hljs-string"> <span class="hljs-number">28px</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">border-bottom</span>:<span class="hljs-string"> <span class="hljs-number">1px</span> solid <span class="hljs-title">#eee</span></span></span>;
}</span><span class="hljs-regexp">div</span><span class="hljs-operator">{
<span class="hljs-operator"><span class="hljs-title1">margin</span>:<span class="hljs-string"><span class="hljs-number">8px</span></span></span>;
}</span><span class="hljs-regexp">.info</span><span class="hljs-operator">{
<span class="hljs-operator"><span class="hljs-title1">padding</span>:<span class="hljs-string"> <span class="hljs-number">12px</span> <span class="hljs-number">0</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">border-bottom</span>:<span class="hljs-string"> <span class="hljs-number">1px</span> solid <span class="hljs-title">#eee</span></span></span>;
}</span><span class="hljs-regexp">.copyright</span><span class="hljs-operator">{
<span class="hljs-operator"><span class="hljs-title1">margin-top</span>:<span class="hljs-string"> <span class="hljs-number">24px</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">padding</span>:<span class="hljs-string"> <span class="hljs-number">12px</span> <span class="hljs-number">0</span></span></span>;
<span class="hljs-operator"><span class="hljs-title1">border-top</span>:<span class="hljs-string"> <span class="hljs-number">1px</span> solid <span class="hljs-title">#eee</span></span></span>;
}</span></span><span class="hljs-regexp"></<span class="hljs-operator">style</span>></span><span class="hljs-regexp"></<span class="hljs-operator">head</span>></span><span class="hljs-regexp"><<span class="hljs-operator">body</span>></span><span class="hljs-regexp"><<span class="hljs-operator">h2</span>></span>圖像上傳和處理示例<span class="hljs-regexp"></<span class="hljs-operator">h2</span>></span><span class="hljs-regexp"><<span class="hljs-operator">form</span> <span class="hljs-operator">method</span>=<span class="hljs-string">"post"</span> <span class="hljs-operator">enctype</span>=<span class="hljs-string">"multipart/form-data"</span> <span class="hljs-operator">class</span>=<span class="hljs-string">"form"</span> <span class="hljs-operator">action</span>=<span class="hljs-string">"{:url('picture')}"</span>></span>
選擇圖像文件:<span class="hljs-regexp"><<span class="hljs-operator">input</span> <span class="hljs-operator">type</span>=<span class="hljs-string">"file"</span> <span class="hljs-operator">class</span>=<span class="hljs-string">"file"</span> <span class="hljs-operator">name</span>=<span class="hljs-string">"image"</span>></span><span class="hljs-regexp"><<span class="hljs-operator">br</span>/></span>
選擇處理類型:<span class="hljs-regexp"><<span class="hljs-operator">select</span> <span class="hljs-operator">name</span>=<span class="hljs-string">"type"</span>></span><span class="hljs-regexp"><<span class="hljs-operator">option</span> <span class="hljs-operator">value</span>=<span class="hljs-string">"1"</span> <span class="hljs-operator">selected</span>></span>圖片裁剪
<span class="hljs-regexp"><<span class="hljs-operator">option</span> <span class="hljs-operator">value</span>=<span class="hljs-string">"2"</span>></span>生成縮略圖
<span class="hljs-regexp"><<span class="hljs-operator">option</span> <span class="hljs-operator">value</span>=<span class="hljs-string">"3"</span>></span>垂直翻轉
<span class="hljs-regexp"><<span class="hljs-operator">option</span> <span class="hljs-operator">value</span>=<span class="hljs-string">"4"</span>></span>水平翻轉
<span class="hljs-regexp"><<span class="hljs-operator">option</span> <span class="hljs-operator">value</span>=<span class="hljs-string">"5"</span>></span>圖片旋轉
<span class="hljs-regexp"><<span class="hljs-operator">option</span> <span class="hljs-operator">value</span>=<span class="hljs-string">"6"</span>></span>添加圖片水印
<span class="hljs-regexp"><<span class="hljs-operator">option</span> <span class="hljs-operator">value</span>=<span class="hljs-string">"7"</span>></span>添加文字水印
<span class="hljs-regexp"></<span class="hljs-operator">select</span>></span><span class="hljs-regexp"><<span class="hljs-operator">br</span>/></span><span class="hljs-regexp"><<span class="hljs-operator">input</span> <span class="hljs-operator">type</span>=<span class="hljs-string">"submit"</span> <span class="hljs-operator">class</span>=<span class="hljs-string">"btn"</span> <span class="hljs-operator">value</span>=<span class="hljs-string">" 提交 "</span>></span><span class="hljs-regexp"></<span class="hljs-operator">form</span>></span><span class="hljs-regexp"><<span class="hljs-operator">div</span> <span class="hljs-operator">class</span>=<span class="hljs-string">"copyright"</span>></span><span class="hljs-regexp"><<span class="hljs-operator">a</span> <span class="hljs-operator">title</span>=<span class="hljs-string">"官方網站"</span> <span class="hljs-operator">href</span>=<span class="hljs-string">"http://www.thinkphp.cn"</span>></span>ThinkPHP<span class="hljs-regexp"></<span class="hljs-operator">a</span>></span><span class="hljs-regexp"><<span class="hljs-operator">span</span>></span>V5<span class="hljs-regexp"></<span class="hljs-operator">span</span>></span><span class="hljs-regexp"><<span class="hljs-operator">span</span>></span>{ 十年磨一劍-為API開發設計的高性能框架 }<span class="hljs-regexp"></<span class="hljs-operator">span</span>></span><span class="hljs-regexp"></<span class="hljs-operator">div</span>></span><span class="hljs-regexp"></<span class="hljs-operator">body</span>></span><span class="hljs-regexp"></<span class="hljs-operator">html</span>></span>
```
```
### 示例演示
訪問下面的URL地址:
```
<pre class="calibre18">
```
<span class="hljs-string">http:</span>
<span class="hljs-comment">//tp5.com/index/upload</span>
```
```
頁面顯示:

這里僅能上傳`png`和`jpg`類型的圖像文件,沒有選擇或者選擇其他類型的文件都會提示:

本節示例選擇上傳的圖片文件為:

點擊上傳并提交后,頁面顯示:

之后會顯示處理之后的圖片:

下面來具體講下各種圖片處理操作的用法。
## 讀取圖片
`think\Image`類提供了`open`方法打開圖片文件
```
<pre class="calibre18">
```
<span class="hljs-comment">// 獲取上傳文件</span><span class="hljs-regexp">$file</span> = <span class="hljs-regexp">$request</span>->file(<span class="hljs-string">'image'</span>);
<span class="hljs-comment">// 讀取圖片文件</span><span class="hljs-regexp">$image</span> = Image::open(<span class="hljs-regexp">$file</span>);
```
```
這里的`$file`是一個`\think\File`對象(其實可以支持任何`SplFileInfo`或者子對象),也可以直接傳入一個圖片文件地址:
```
<pre class="calibre18">
```
<span class="hljs-comment">// 讀取圖片文件</span><span class="hljs-regexp">$image</span> = Image::open(<span class="hljs-string">'./logo.png'</span>);
```
```
> `open`方法不支持讀取遠程圖片
使用open方法讀取圖片文件后,可以讀取圖片相關信息:
```
<pre class="calibre18">
```
<span class="hljs-comment">// 返回圖片的寬度</span><span class="hljs-regexp">$width</span> = <span class="hljs-regexp">$image</span>->width();
<span class="hljs-comment">// 返回圖片的高度</span><span class="hljs-regexp">$height</span> = <span class="hljs-regexp">$image</span>->height();
<span class="hljs-comment">// 返回圖片的類型</span><span class="hljs-regexp">$type</span> = <span class="hljs-regexp">$image</span>->type();
<span class="hljs-comment">// 返回圖片的mime類型</span><span class="hljs-regexp">$mime</span> = <span class="hljs-regexp">$image</span>->mime();
<span class="hljs-comment">// 返回圖片的尺寸數組 [ 圖片寬度 , 圖片高度 ]</span><span class="hljs-regexp">$size</span> = <span class="hljs-regexp">$image</span>->size();
```
```
## 圖片裁剪
圖片剪裁使用`crop`方法,用法:
> #### crop(剪裁寬度,剪裁高度,X坐標(默認0),Y坐標(默認0))
示例中圖片剪裁的主要代碼為
```
<pre class="calibre18">
```
<span class="hljs-regexp">$image</span>->crop(<span class="hljs-number">300</span>, <span class="hljs-number">300</span>);
```
```
表示從左上角開始剪裁寬高都是300的圖片,如果需要改變剪裁的坐標位置,可以用:
```
<pre class="calibre18">
```
$image->crop(<span class="hljs-number">300</span>, <span class="hljs-number">300</span>, <span class="hljs-number">100</span>, <span class="hljs-number">50</span>);
```
```
最終的效果變成:

## 生成縮略圖
生成圖片縮略圖使用`thumb`方法,用法:
> #### thumb(最大寬度,最大高度,裁剪類型)
縮略圖剪裁類型包括如下:
剪裁類型(常量=值) 描述 Image::THUMB\_SCALING = 1 等比例縮放(默認類型) Image::THUMB\_FILLED = 2 縮放后填充 Image::THUMB\_CENTER = 3 居中裁剪 Image::THUMB\_NORTHWEST = 4 左上角裁剪 Image::THUMB\_SOUTHEAST = 5 右下角裁剪 Image::THUMB\_FIXED = 6 固定尺寸縮放示例代碼中的縮略圖效果如圖:

## 圖像翻轉
圖片翻轉使用`flip`方法,用法如下:
> #### flip(翻轉方式)
翻轉方式 常量值 垂直翻轉 Image::FLIP\_X=1 水平翻轉 Image::FLIP\_Y=2垂直翻轉效果:

水平翻轉效果:

## 圖片旋轉
圖片翻轉使用`rotate`方法,用法如下:
> #### rotate(順時針旋轉的度數)
示例采用90旋轉的效果如圖:

## 添加水印
使用`water`方法添加圖片水印
> #### water(水印圖片,水印位置常量(默認右下角),水印透明度(默認100))
水印位置常量如下:
水印位置 常量值 左上角 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示例代碼:
```
<pre class="calibre18">
```
<span class="hljs-regexp">$image</span>->water(<span class="hljs-string">'./logo.png'</span>, Image::WATER_NORTHWEST, <span class="hljs-number">50</span>);
```
```
示例水印效果如圖:

> 為了示例效果,在操作之前,請把下面的logo圖片保存到public目錄下面。
>
> 
## 文字水印
使用`text`方法給圖片添加文字(水印)
> #### text(水印文字,字體文件路徑,文字大小,文字顏色,文字寫入位置,偏移量,文字傾斜角度)
前面四個參數必須,顏色默認為 #000000 文字位置常量和水印位置一樣。
示例代碼
```
<pre class="calibre18">
```
<span class="hljs-regexp">$image</span>->text(<span class="hljs-string">'ThinkPHP'</span>, VENDOR_PATH . <span class="hljs-string">'topthink/think-captcha/assets/ttfs/1.ttf'</span>, <span class="hljs-number">20</span>, <span class="hljs-string">'#ffffff'</span>);
```
```

> 為了配合演示,我們使用了驗證碼類庫中的字體素材
## 圖片保存
前面所有的操作都是對圖片進行相關的處理,最后一步就是需要把處理過的圖片文件保存下來。
這就需要調用`save`方法進行圖片的保存操作
> #### save(保存文件名,圖像類型,圖像質量,隔行掃描)
示例中使用當前時間戳作為文件名保存圖片文件,代碼:
```
<pre class="calibre18">
```
<span class="hljs-comment">// 保存圖片(以當前時間戳)</span><span class="hljs-regexp">$saveName</span> = <span class="hljs-regexp">$request</span>->time() . <span class="hljs-string">'.png'</span>;
<span class="hljs-regexp">$image</span>->save(ROOT_PATH . <span class="hljs-string">'public/uploads/'</span> . <span class="hljs-regexp">$saveName</span>);
```
```
默認圖片保存的質量是`80`,如果希望采用最高的質量保存,可以使用下面的代碼:
```
<pre class="calibre18">
```
<span class="hljs-comment">// 保存圖片(以當前時間戳)</span><span class="hljs-regexp">$saveName</span> = <span class="hljs-regexp">$request</span>->time() . <span class="hljs-string">'.png'</span>;
<span class="hljs-comment">// 采用最高質量保存圖片</span><span class="hljs-regexp">$image</span>->save(ROOT_PATH . <span class="hljs-string">'public/uploads/'</span> . <span class="hljs-regexp">$saveName</span>,<span class="hljs-string">'png'</span>,<span class="hljs-number">100</span>);
```
```
> save方法的第四個參數僅針對jpg格式的圖像類型。
- 脕茫隆壟脨貌脩脭
- 脕茫隆壟脨貌脩脭
- 脪祿隆壟祿霉麓隆
- 脪祿隆壟祿霉麓隆
- 露鎂隆壟URL潞脥脗路脫脡
- 露鎂隆壟URL潞脥脗路脫脡
- 脠媒隆壟脟毛脟貿潞脥脧矛脫婁
- 脠媒隆壟脟毛脟貿潞脥脧矛脫婁
- 脣脛隆壟脢媒戮脻驢芒
- 脣脛隆壟脢媒戮脻驢芒
- 脦氓隆壟虜茅脩爐脫茂脩脭
- 脦氓隆壟虜茅脩爐脫茂脩脭
- 脕霉隆壟脛攏脨脥潞脥鹿脴脕陋
- 攏簍1攏漏脛攏脨脥露簍脪氓
- 攏簍2攏漏祿霉麓隆虜脵脳梅
- 攏簍3攏漏露脕脠隆脝梅潞脥脨脼賂脛脝梅
- 攏簍4攏漏脌脿脨脥脳陋祿祿潞脥脳脭露爐脥錨魯脡
- 攏簍5攏漏虜茅脩爐路露脦摟
- 攏簍6攏漏脢盲脠毛潞脥脩茅脰隴
- 攏簍7攏漏鹿脴脕陋
- 攏簍8攏漏脛攏脨脥脢盲魯枚
- 脝脽隆壟脢脫脥錄潞脥脛攏擄氓
- 脝脽隆壟脢脫脥錄潞脥脛攏擄氓
- 擄脣隆壟碌梅脢脭潞脥脠脮脰戮
- 擄脣隆壟碌梅脢脭潞脥脠脮脰戮
- 戮脜隆壟API驢陋路壟
- 戮脜隆壟API驢陋路壟
- 脢廬隆壟脙眉脕卯脨脨鹿隴戮脽
- 脢廬隆壟脙眉脕卯脨脨鹿隴戮脽
- 脢廬脪祿隆壟脌漏脮鹿
- 脢廬脪祿隆壟脌漏脮鹿
- 脢廬露鎂隆壟脭脫脧卯
- Cookie
- Session
- 碌樓脭陋虜芒脢脭
- 脥錄脧帽麓婁脌鉚
- 脦脛錄鎂脡脧麓蘆
- 脩茅脰隴脗毛
- 賂陸脗錄
- A隆壟魯攏錄沒脦脢脤芒錄爐
- B隆壟3.2潞脥5.0脟酶鹵冒
- C隆壟脰煤脢脰潞爐脢媒
- 路盧脥芒脝陋攏潞脩摟脧擄ThinkPHP5碌脛脮媒脠路脳脣脢脝
- 路盧脥芒脝陋攏潞脩摟脧擄ThinkPHP5碌脛脮媒脠路脳脣脢脝