php GD庫實現圖片合併、文本居中 案例:生成分享海報

因有需求要做到用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、將文字加到合併後的圖片上

希望可以幫到有需要的同學

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章