項目中需要添加生成海報的功能,需要根據不同的新聞,商品信息生成不同的海報,所以我採用了在背景圖上依次打圖片水印和文字水印的方式來生成海報,我先上傳一張生成的海報,可以看一下是不是你想要的結果
yii添加水印功能
一、給yii框架引入圖片水印擴展
項目根目錄下執行 composer require --prefer-dist yiisoft/yii2-imagine
要是嫌慢的話可以把composer切換過國內的阿里雲鏡像,鏈接,加載成功後會生成vendor/yiisoft/yii2-imagine文件夾
二、擴展的使用
下邊是一些使用說明,擴展裏還封裝了一些其他的方法,一看就能明白,我只是列舉出來一些常用的功能
use yii\imagine\Image;
class MarketingController extends BaseController
{
/**
* 裁剪圖像。
* @param string $resource 包含文件路徑的字符串
* @param int $width 裁剪寬度
* @param int $height 裁剪高度
* @param array $position 開始位置。這必須是一個數組,其中有兩個元素表示“x”和“y”座標。
* @param string $savePath 保存文件路徑
*/
public function actionCrop()
{
Image::crop($resource, $width, $height ,$position)
->save(\Yii::getAlias($savePath), ['quality' => 100]);
}
/**
* 在圖像周圍添加邊框。請注意,圖像大小將增加“$margin”x 2
* @param string $resource 包含文件路徑的字符串
* @param int $margin 要在圖像周圍添加的幀大小
* @param string $color 邊框顏色
* @param int $alpha 幀的alpha值
* @param string $savePath 保存文件路徑
*/
public function actionRotate()
{
Image::frame($resource, $margin, $color, $alpha)
->save(\Yii::getAlias($savePath), ['quality' => 100]);
}
/**
* 創建縮略圖
* @param string $resource 包含文件路徑的字符串
* @param int $width 寬度
* @param int $height 高度
* @param string $mode 如果使用默認的“ImageInterface::THUMBNAIL_OUTBOUND”模式,則會縮放縮略圖,以便
它的最小邊等於原始圖像中對應邊的長度。任何超出縮放的縮略圖區域將被裁剪,返回的縮
略圖將具有準確的寬度和高度指定的。
如果縮略圖模式爲“ImageInterface::thumbnail_INSET”,則會縮小原始圖像,使其完全
包含在縮略圖尺寸中。剩下的部分是可以通過
[[Image::$thumbnailBackgroundColor]]和[[Image::$thumbnailBackgroundAlpha]]。
* @param string $savePath 保存文件路徑
*/
public function actionThumb()
{
Image::thumbnail($resource, $width, $height, $mode)
->save(\Yii::getAlias($savePath), ['quality' => 100]);
}
/**
* 圖片水印。
* @param string $resource 包含文件路徑的字符串
* @param string $mark 水印圖片路徑
* @param array $position 開始位置。這必須是一個數組,其中有兩個元素表示“x”和“y”座標。
* @param string $savePath 保存文件路徑
*/
public function actionWatermark()
{
Image::watermark($resource, $mark, $position)
->save(\Yii::getAlias($savePath), ['quality' => 100]);
}
/**
* 文字水印。
* @param string $resource 包含文件路徑的字符串
* @param string $content 要寫入圖像的文本
* @param string $font 文件路徑或路徑別名
* @param array $position 開始文本的起始位置。這必須是一個數組,其中有兩個元素表示“x”和“y”座標。
* @param string $color 字體顏色,默認爲“fff”
* @param string $size 字體大小,默認爲12
* @param string $angle 用於編寫文本的角度。默認爲0
* @param string $savePath 保存文件路徑
*/
public function actionText()
{
Image::text($resource, $content, $font,$position,[$color,$size,$angle])
->save(\Yii::getAlias($savePath), ['quality' => 100]);
}
}
小程序碼生成
要求生成的海報中有小程序碼,用戶掃碼後可以直接登錄到我們的小程序內部,生成小程序碼的官方文檔地址 。一共提供了三個接口,接口A和B生成的是葵花碼,接口C生成的是二維碼,我這邊用的是接口B,所以就以接口B爲例
1、通過申請的appid和secret換取微信access_token(獲取的access_token有效期是兩個小時,可以做一下緩存,避免重複請求)
2、通過access_token獲取小程序碼(傳入的參數$page和$scene需要注意下,格式容易出錯)
3、傳遞的參數中特殊字符發送到小程序時會被轉義,所以需要前端同學在接收時候做一下處理
下面貼代碼
class Weixin{
public $appid = '123456789';
public $secret = '123456789';
public function accessToken(){
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$this->appid."&secret=".$this->secret;
$respStr = self::curlGet($url);
$arr = json_decode($respStr, true);
return empty($arr['access_token']) ? '' : $arr['access_token'];
}
/**
* 小葵花二維碼
*
* @access public
* @param string $jpg 二維碼保存路徑
* @param string $page 必須是已經發布的小程序存在的頁面(否則報錯),例如 pages/index/index, 根路徑前不要填加 /,不能攜帶參數(參數請放在scene字段裏),如果不填寫這個字段,默認跳主頁面
* @param string $scene 最大32個可見字符,只支持數字,大小寫英文以及部分特殊字符:!#$&'()*+,/:;=?@-._~,其它字符請自行編碼爲合法字符(因不支持%,中文無法使用 urlencode 處理,請使用其他編碼方式)
* @param int $width 二維碼的寬度,單位 px,最小 280px,最大 1280px
*/
public function createQR($jpg,$page,$scene,$width){
$cache = \Yii::$app->cache;
$access_token = $cache->get('access_token');
if(!$access_token){
$access_token = $this->accessToken();
$access_token = $cache->set('access_token',$access_token,3600);
}
$url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=".$access_token;
$data = [
"page"=>$page,
"scene"=>$scene,
"width"=>$width,
];
$pic = self::curlPost($url,$data);
@ob_end_clean(); //清空緩衝區
$fp = fopen($jpg,'w'); //寫入圖片
if(fwrite($fp,$pic))
{
fclose($fp);
}
return true;
}
/**
* GET 請求
* @param string $url 路徑
*/
public static function curlGet($url){
$header = array(
'Accept: application/json',
);
$curl = curl_init();
//設置抓取的url
curl_setopt($curl, CURLOPT_URL, $url);
//設置頭文件的信息作爲數據流輸出
curl_setopt($curl, CURLOPT_HEADER, 0);
// 超時設置,以秒爲單位
curl_setopt($curl, CURLOPT_TIMEOUT, 1);
// 超時設置,以毫秒爲單位
// curl_setopt($curl, CURLOPT_TIMEOUT_MS, 500);
// 設置請求頭
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
//設置獲取的信息以文件流的形式返回,而不是直接輸出。
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
//執行命令
$data = curl_exec($curl);
// 顯示錯誤信息
if (curl_error($curl)) {
print "Error: " . curl_error($curl);
} else {
// 打印返回的內容
curl_close($curl);
return $data;
}
}
/**
* POST 請求
* @param string $url 路徑
* @param array $param 參數
*/
public static function curlPost($url,$param){
$curl = curl_init();
if(stripos($url,"https://")!==FALSE){
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1
}
$data = json_encode($param);
curl_setopt_array($curl, array(
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => $data,
CURLOPT_HTTPHEADER => array(
"Content-Type: application/json",
"cache-control: no-cache"
),
));
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
return("cURL Error #:" . $err);
} else {
return($response) ;
}
}
}
$weixin = new Weixin();
echo $weixin->createQR('123.jpg',$page="pages/enter/enter",$scene="123",$width="280");