因有需求要做到用php服務端去生成分享海報,並要求把頭像、文字、以及二維碼跟海報背景圖合併,所以研究了一下php的GD庫來實現該需求
本次用到的函數介紹
getimagesize 獲取圖片的寬高
imagecreatefromjpeg 將圖片轉換爲圖片資源型 本次用的是jpeg,更多類型還有jpg、gif等,具體請查百度
imagecreatetruecolor 按照指定寬高畫一個圖
imagecopyresampled 圖片拷貝合併
imagettfbbox 計算文字寬高
imagettftext 將文字放到圖片上
imagepng 輸出圖片
imagedestroy 銷燬圖片內存
imagecreatetruecolor 創建一塊指定寬高的畫布
自己封裝了個生成海報的方法,直接上代碼。
<?php
class Lib_GeneratePoster {
private static $newQrCode; // 縮小後的新二維碼圖片資源
private static $oriQrCode; // 縮小前原二維碼圖
private static $newImg; // 合併圖片後的圖片資源
private static $headerImg; // 頭像資源
private static $newHeaderImg; // 放大後的頭像資源
private static $headerBlank; // 空白圖片跟頭像
private static $OriginalPictureWidth = 0; // 原圖片寬度
private static $OriginalPictureHeight = 0; // 原圖片高度
private static $new_width = 225; // 二維碼縮小後的寬度
private static $new_height = 225; // 二維碼縮小後的高度
private static $FONT_TTF = __DIR__ . '/ttf/msyh.ttf'; // 字體文件
private static $FONT_SIZE = 23; // 文字大小
/* 生成活動海報圖片
* @param $nick_name 用戶暱稱
* @param $avatar_url 用戶頭像
*
* */
public static function CreateImg($nick_name, $avatar_url){
$red_package = '圖片背景原圖';
$img = '二維碼圖片';
// 計算活動原圖寬高
list(self::$OriginalPictureWidth, self::$OriginalPictureHeight) = getimagesize($red_package);
header("Content-type: image/png");
// 縮小二維碼圖片
self::narrowPicture($img, $avatar_url);
// 創建白板畫布
self::createBlank();
// 生成合並後的圖片
self::output($red_package, $nick_name, $avatar_url);
}
/* 將二維碼圖片縮小 && 頭像放大
* @param $img 二維碼圖片
* @param $avatar_url 用戶頭像
*/
private static function narrowPicture($img, $avatar_url){
$width = 430; // 圖片原寬度
$height = 430; // 圖片原高度
self::$oriQrCode = imagecreatefromjpeg($img); // 原頭像
self::$headerImg = imagecreatefromjpeg($avatar_url); // 新頭像
self::$newQrCode = imagecreatetruecolor(self::$new_width, self::$new_height); // 按照新的寬高畫一個圖
imagecopyresampled(self::$newQrCode, self::$oriQrCode, 0, 0, 0, 0, self::$new_width, self::$new_height, $width, $height);
$header_old_width = 130;
$header_old_height = 130;
$header_new_width = 230;
$header_new_height = 205;
// 新頭像寬高
self::$newHeaderImg = imagecreatetruecolor($header_new_width, $header_new_height);
imagecopyresampled( self::$newHeaderImg, self::$headerImg, 0, 0, 0, 0, $header_new_width, $header_new_height, $header_old_width, $header_old_height);
}
/* 海報合併後的圖片
* @param $red_package 原背景圖
* @param $nick_name 用戶暱稱
* @param $avatar_url 用戶頭像
*/
private static function output($red_package, $nick_name, $avatar_url){
// 合併二維碼
self::$newImg = imagecreatefrompng($red_package);
imagesavealpha(self::$newImg, true);
// 將二維碼海報放到白板畫布頭像上
imagecopy(self::$headerBlank, self::$newImg ,0, 0, 0, 0, self::$OriginalPictureWidth, self::$OriginalPictureHeight);
// 棕色
$brown = imagecolorallocate(self::$headerBlank, 108,23,6);
// 加字
$text = '圖片文字';
// 計算出文字在圖片中的寬度
$p = imagettfbbox(self::$FONT_SIZE,0,self::$FONT_TTF,$text);
$txt_width=$p[2]-$p[0];
// 獲取文字在圖片中居中的x軸
$x = (self::$OriginalPictureWidth - $txt_width) / 2;
imagettftext(self::$headerBlank, self::$FONT_SIZE, 0, $x, 120, $brown, self::$FONT_TTF, $text);
// 輸出圖片
imagepng(self::$headerBlank);
imagedestroy(self::$headerBlank);
}
/* 創建一塊畫布把頭像放上去
*/
private static function createBlank(){
self::$headerBlank = imagecreatetruecolor(self::$OriginalPictureWidth, self::$OriginalPictureHeight);
$white = imagecolorallocate(self::$headerBlank, 255, 255, 255);
imagefill(self::$headerBlank, 0, 0, $white);
// 將頭像放到白色背景上
imagecopymerge(self::$headerBlank, self::$newHeaderImg ,260, 280, 0, 0, 230, 205, 100);
// 放二維碼到圖片上
imagecopymerge(self::$headerBlank, self::$newQrCode, 257, 557, 0, 0, self::$new_width, self::$new_height, 100);
}
}
本次的TTF文字用的是微軟雅黑,下面是下載地址:
鏈接:https://pan.baidu.com/s/1dHHCq9DiOqLD6ra3Sg0LPw 密碼:dl57
大致的邏輯是:
1、生成一塊白板畫布
2、將二維碼、頭像合併到白板畫布上
3、將背景海報蓋到白板畫布上合成圖片
4、將文字加到合併後的圖片上
希望可以幫到有需要的同學