php生成微信小程序海报图

分享朋友圈现在大家的通用做法就是通过Canvas生成一张图片后进行保存,然后自行转发朋友圈。但是有时候有特殊需求得让后台生成。

如果想要海报上的二维码扫码完直接跳到指定的页面, 那么就需要生成一个带参数的二维码, 你需要看我的另一篇博客:微信小程序生成带参数的二维码以及小程序码

先看一下效果图:

//生成分享海报
public function createShareBanner(Request $request)
{
    $page_url = $request->input('page_url');
    $scene = $request->input("scene");

    if (!$inn_id || !$page_url || !$scene) {
        return $this->apiReturn(ERROR, [], '参数有误');
    }

    $minPrice = 99.00;

    $cover_map = '封面图地址';

    // 缩放图片
    $banner = $this->scale($cover_map, 520, 300);

    //创建画布
    $img = imagecreatetruecolor(560, 684);

    //给画布填充颜色
    $img_color = imagecolorallocate($img, 255, 255, 255);

    //填充
    imagefill($img, 0, 0, $img_color);

    //LOGO
    $this->createImg($img, "share/logo.png", 30, 20);

    //55客图标
    $this->createImg($img, "name.png", 120, 35);

    //banner图
    $this->createImg($img, $banner, 20, 120);

    //小程序二维码
    $qrCodeUrl = $this->getUnlimited($scene, $page_url);
    $qr = $this->scale($qrCodeUrl, 188, 188);
    $this->createImg($img, $qr, 350, 440);

    //圆角
    //$this->createImg($img, "share/radius.png", 45,360);

    //地址图标
    $this->createImg($img, "address.png", 65, 365);

    //字体
    $this->createFont($img, 102, 102, 102, 14, 120, 100, "国内精品民宿客栈预定平台");

    //客栈名
    $this->createFont($img, 51, 51, 51, 18, 20, 460, $innInfo->name);

    //描述
    $this->createFont($img, 153, 153, 153, 12, 20, 500, mb_substr($this->deleteHtml($innInfo->content), 0, 18));
    $this->createFont($img, 153, 153, 153, 12, 20, 530, mb_substr($this->deleteHtml($innInfo->content), 18, 15) . "...");


    $this->createFont($img, 153, 153, 153, 12, 20, 580, "保存分享有好礼");

    $this->createFont($img, 229, 62, 30, 20, 20, 630, "¥");

    //价格
    $this->createFont($img, 229, 62, 30, 20, 45, 630, $minPrice);

    $font = public_path() . "/msyhbd.ttf";

    //计算价格后的坐标点 加.00 是因为该方法在处理的时候默认去掉了
    $intx = imagettfbbox(20, 0, $font, $minPrice . ".00");

    $this->createFont($img, 229, 62, 30, 14, $intx[2] + 8, 630, "起/间");
    //地点
    $this->createFont($img, 255, 255, 255, 14, 100, 385, $innInfo->address_name . "-" . $innInfo->nation_name);

    //输出/保存图片
    header('Content-type: image/png');

    //删除缩放的图片
    unlink($banner);
    unlink($qrCodeUrl);

    ob_start();   //启用输出缓冲
    imagepng($img);    //输出图像
    $imagebin = ob_get_contents();    //将缓冲的数据存入变量
    ob_end_clean();    //结束并清空输出缓存*/

    //释放画布
    imagedestroy($img);

    $rand = "nscale" . rand(1, 999) . ".png";
    $file = public_path() . "/scale" . "/" . $rand;

    file_put_contents($file, $imagebin);

    $domain = "https://" . $request->server('HTTP_HOST') . "/";


    return $domain . "/scale/" . $rand;

}

//给画布指定位置添加图片
public function createImg($img, $file, $x, $y)
{
    //获取文件大小
    list($logo_width, $logo_height, $type) = getimagesize($file);

    //类型
    $typeList = array(1 => "gif", 2 => "jpeg", 3 => "png");

    //根据不同类型的图片生成不同的画布
    $logoFun = "imagecreatefrom" . $typeList[$type];

    //添加文件
    imagecopy($img, $logoFun($file), $x, $y, 0, 0, $logo_width, $logo_height);
}

//给画布指定位置添加文字
public function createFont($img, $red, $green, $bule, $size, $x, $y, $text, $fontSrc = '')
{
    //颜色
    $color = imagecolorallocate($img, $red, $green, $bule);

    //字体
    if (empty($fontSrc)) {
        $font = public_path() . "/msyhbd.ttf";
    } else {
        $font = public_path() . "/myfont3.TTF";
    }

    imagettftext($img, $size, 0, $x, $y, $color, $font, $text);

}

//提取HTML中的文字
public function deleteHtml($str)
{
    $str = trim($str); //清除字符串两边的空格
    $str = strip_tags($str, ""); //利用php自带的函数清除html格式
    $str = preg_replace("/\t/", "", $str); //使用正则表达式替换内容,如:空格,换行,并将替换为空。
    $str = preg_replace("/\r\n/", "", $str);
    $str = preg_replace("/\r/", "", $str);
    $str = preg_replace("/\n/", "", $str);
    $str = preg_replace("/ /", "", $str);
    $str = preg_replace("/  /", "", $str);  //匹配html中的空格
    return trim($str); //返回字符串
}

//缩放图片
public function scale($filename, $new_width, $new_height)
{
    //创建一个指定大小的画布
    $image_p = imagecreatetruecolor($new_width, $new_height);

    //类型
    $typeList = array(1 => "gif", 2 => "jpeg", 3 => "png");

    // 获取新的尺寸
    list($width, $height, $type) = getimagesize($filename);

    //根据不同类型的图片生成不同的画布
    $logoFun = "imagecreatefrom" . $typeList[$type];

    //缩放图片
    imagecopyresampled($image_p, $logoFun($filename), 0, 0, 0, 0, $new_width, $new_height, $width, $height);

    // 输出函数
    $echo = "image" . $typeList[$type];

    ob_start();   //启用输出缓冲
    $echo($image_p);    //输出图像
    $imagebin = ob_get_contents();    //将缓冲的数据存入变量
    ob_end_clean();    //结束并清空输出缓存

    //释放画布
    imagedestroy($image_p);

    $file = storage_path() . "/scale" . "/scale" . rand(1, 999) . "." . $typeList[$type];

    file_put_contents($file, $imagebin);

    return $file;
}

/**
 * 删除最终生成的图片
 */
public function delImg(Request $request)
{
    $src = $request->input('src');

    if (!$src) {
        return $this->apiReturn(ERROR, [], '参数有误');
    }

    $domain = "https://" . $request->server('HTTP_HOST') . "/";

    $path = public_path() . "/";
    $newSrc = str_replace($domain, $path, $src);

    unlink($newSrc);

}

/**
 * 小程序生成二维码
 * @return string
 */
public function getUnlimited($scene, $page)
{
    $url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" . $this->getAccessToken();
    $data = [
        "scene" => $scene,
        "page" => $page,
    ];

    $json = $this->getData($url, "POST", json_encode($data));

    $file = storage_path() . "/scale" . "/qrcode" . rand(1, 999) . ".png";

    file_put_contents($file, $json);

    return $file;
}

标签

发表评论