使用PHP生成海报图分享图片的教程和方法

php,php生成图片,php生成海报

随着社交媒体的普及,分享图片已成为人们日常生活中常见的行为之一。在这个过程中,我们经常需要生成一些精美的海报图来吸引他人的注意。本文将介绍如何使用PHP来生成海报图并进行分享。

1. 准备工作

首先,我们需要准备以下数据和资源:

  1. 待生成海报图的数据 $gData,包括图片地址、标题、博客名称和日期等信息。

  2. 用于生成二维码的图片 $codeName,可以是任意有效的二维码图片。

2. 图片生成函数

我们将创建一个名为 createSharePng 的函数来生成海报图。函数接收三个参数:$gData(数据数组)、$codeName(二维码图片)和可选的 $fileName(保存文件名,默认为空)。

具体实现如下:

<?php

/**
 * 分享图片生成
 * @param $gData  数据,array
 * @param $codeName 二维码图片
 * @param $fileName string 保存文件名,默认空则直接输入图片
 */
function createSharePng($gData, $codeName, $fileName = '')
{
    //创建画布
    $width = 800;
    $height = 800;
    $im = imagecreatetruecolor($width, $height);

    //填充画布背景色
    //$color = imagecolorallocate($im, 85, 85, 85);
    $color = imagecolorallocate($im, 255, 255, 255);
    imagefill($im, 0, 0, $color);

    //字体文件
    //$font_file_1 = "code_png/hanyishuaixiantiw.ttf";
    $font_file_2 = "../assets/hanyixizhongyuan.ttf";

    //设定字体的颜色
    $font_color_title = ImageColorAllocate($im, 255, 255, 255);
    $font_color_1 = ImageColorAllocate($im, 28, 28, 28);
    $fang_bg_color_1 = ImageColorAllocate($im, 85, 85, 85);
    $fang_bg_color_2 = ImageColorAllocate($im, 255, 255, 255);

    //图片
    list($g_w, $g_h) = getimagesize($gData['pic']);
    $goodImg = createImageFromFile($gData['pic']);
    imagecopyresized($im, $goodImg, 0, 0, 0, 0, 800, 580, $g_w, $g_h);

    //----------
    //imagefilledrectangle ($im, 0, 580, 580, 800, $fang_bg_color_1);
    //imagefilledrectangle ($im, 580, 580, 800, 800, $fang_bg_color_2);
    //二维码
    list($code_w, $code_h) = getimagesize($codeName);
    $codeImg = createImageFromFile($codeName);
    imagecopyresized($im, $codeImg, 600, 600, 0, 0, 180, 180, $code_w, $code_h);

    //描述
    $theTitle = cn_row_substr($gData['title'], 2, 20);
    imagettftext($im, 20, 0, 20, 635, $font_color_1, $font_file_2, $theTitle[1]);
    imagettftext($im, 20, 0, 20, 680, $font_color_1, $font_file_2, $theTitle[2]);
    //imagettftext($im, 28,0, 20, 630, $font_color_1 ,$font_file_2, $gData["title"]);

    imagettftext($im, 13, 0, 20, 720, $font_color_1, $font_file_2, $gData["date"]);
    imagettftext($im, 18, 0, 20, 770, $font_color_1, $font_file_2, $gData["blogName"]);

    //输出图片
    if ($fileName) {
        imagepng($im, $fileName);
    } else {
        Header("Content-Type: image/png");
        imagepng($im);
    }

    //释放空间
    imagedestroy($im);
    imagedestroy($goodImg);
    imagedestroy($codeImg);
}

/**
 * 从图片文件创建Image资源
 * @param $file 图片文件,支持url
 * @return bool|resource    成功返回图片image资源,失败返回false
 */
function createImageFromFile($file)
{
    if (preg_match('/http(s)?:\/\//', $file)) {
        $fileSuffix = getNetworkImgType($file);
    } else {
        $fileSuffix = pathinfo($file, PATHINFO_EXTENSION);
    }

    if (!$fileSuffix) return false;

    switch ($fileSuffix) {
        case 'jpeg':
            $theImage = @imagecreatefromjpeg($file);
            break;
        case 'jpg':
            $theImage = @imagecreatefromjpeg($file);
            break;
        case 'png':
            $theImage = @imagecreatefrompng($file);
            break;
        case 'gif':
            $theImage = @imagecreatefromgif($file);
            break;
        default:
            $theImage = @imagecreatefromstring(file_get_contents($file));
            break;
    }
    return $theImage;
}

/**
 * 获取网络图片类型
 * @param $url  网络图片url,支持不带后缀名url
 * @return bool
 */
function getNetworkImgType($url)
{
    $ch = curl_init(); //初始化curl
    curl_setopt($ch, CURLOPT_URL, $url); //设置需要获取的URL
    curl_setopt($ch, CURLOPT_NOBODY, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3); //设置超时
    curl_setopt($ch, CURLOPT_TIMEOUT, 3);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //支持https
    curl_exec($ch); //执行curl会话
    $http_code = curl_getinfo($ch); //获取curl连接资源句柄信息
    curl_close($ch); //关闭资源连接
    if ($http_code['http_code'] == 200) {
        $theImgType = explode('/', $http_code['content_type']);

        if ($theImgType[0] == 'image') {
            return $theImgType[1];
        } else {
            return false;
        }
    } else {
        return false;
    }
}
/**
 * 分行连续截取字符串
 * @param $str  需要截取的字符串,UTF-8
 * @param int $row  截取的行数
 * @param int $number   每行截取的字数,中文长度
 * @param bool $suffix  最后行是否添加‘...’后缀
 * @return array    返回数组共$row个元素,下标1到$row
 */
function cn_row_substr($str, $row = 1, $number = 10, $suffix = true)
{
    $result = array();
    for ($r = 1; $r <= $row; $r++) {
        $result[$r] = '';
    }

    $str = trim($str);
    if (!$str) return $result;

    $theStrlen = strlen($str);

    //每行实际字节长度
    $oneRowNum = $number * 3;
    for ($r = 1; $r <= $row; $r++) {
        if ($r == $row and $theStrlen > $r * $oneRowNum and $suffix) {
            $result[$r] = mg_cn_substr($str, $oneRowNum - 6, ($r - 1) * $oneRowNum) . '...';
        } else {
            $result[$r] = mg_cn_substr($str, $oneRowNum, ($r - 1) * $oneRowNum);
        }
        if ($theStrlen < $r * $oneRowNum) break;
    }

    return $result;
}

/**
 * 按字节截取utf-8字符串
 * 识别汉字全角符号,全角中文3个字节,半角英文1个字节
 * @param $str  需要切取的字符串
 * @param $len  截取长度[字节]
 * @param int $start    截取开始位置,默认0
 * @return string
 */
function mg_cn_substr($str, $len, $start = 0)
{
    $q_str = '';
    $q_strlen = ($start + $len) > strlen($str) ? strlen($str) : ($start + $len);

    //如果start不为起始位置,若起始位置为乱码就按照UTF-8编码获取新start
    if ($start and json_encode(substr($str, $start, 1)) === false) {
        for ($a = 0; $a < 3; $a++) {
            $new_start = $start + $a;
            $m_str = substr($str, $new_start, 3);
            if (json_encode($m_str) !== false) {
                $start = $new_start;
                break;
            }
        }
    }

    //切取内容
    for ($i = $start; $i < $q_strlen; $i++) {
        //ord()函数取得substr()的第一个字符的ASCII码,如果大于0xa0的话则是中文字符
        if (ord(substr($str, $i, 1)) > 0xa0) {
            $q_str .= substr($str, $i, 3);
            $i += 2;
        } else {
            $q_str .= substr($str, $i, 1);
        }
    }
    return $q_str;
}

3. 实际使用方法

在准备好以上代码后,我们可以按照以下步骤来生成海报图:

  1. 定义待生成海报图的数据 $gData。

  2. 调用 createSharePng 函数,并传入 $gData 和二维码图片地址 $codeName,可选择是否提供保存文件名。

<?php
$gData = [
    'pic' => 'https://www.toymoban.com/style/images/logo.png',
    'title' =>'文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题',
    'blogName' => '',
    'date' => '2023/11/25'
];
// 直接输出
createSharePng($gData,'https://www.toymoban.com/?site=weixin&url=https://www.explame.com/');
// 输出到图片
createSharePng($gData,'https://www.toymoban.com?site=weixin&url=https://www.explame.com/','images/share-' . time() . rand(10000, 99999) . '.jpg');
?>

在调用 createSharePng 函数后,即可生成海报图并将其输出或保存为文件。

通过本文的方法,我们可以方便地使用PHP生成海报图分享图片。文章来源地址https://www.toymoban.com/diary/php/555.html

到此这篇关于使用PHP生成海报图分享图片的教程和方法的文章就介绍到这了,更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

原文地址:https://www.toymoban.com/diary/php/555.html

如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用
记录几个国内前端CDN静态资源公共库
上一篇 2023年11月25日 10:00
C++函数指针和Lambda匿名函数:用法和捕获示例
下一篇 2023年11月25日 10:49

相关文章

  • PHP 合并图片,微信小程序合并海报,合并文字

    //业务需求:我们需要一个微信小程序码,但是是需要提供给别人扫码的但是只有一个纯粹的小程序码是不好看的,所以需要推广的海报图片。再结合文字   最终效果     准备工作  1、需要海报的底图  2、小程序码的图片  代码部分结合YII2但不影响使用 完整过程 第一步:

    2024年02月08日
    浏览(66)
  • 微信小程序使用canvas画布生成二维码海报分享图片(完整示例代码)

    canvas.js //获取应用实例 const app = getApp() Page({ /** 页面的初始数据 */ data: { // canvas _width: 0, //手机屏宽 _heigth: 0,//手机屏高 swiperHeight: 300,//主图图片高度 canvasType: false,//canvas是否显示 loadImagePath: ‘’,//下载的图片 imageUrl: ‘https://cos.myfaka.com/car/service/1.jpg’, //主图网络路径 codeU

    2024年04月12日
    浏览(92)
  • PHP版滴滴cps联盟Api签名生成和接口调用方法分享

    最近准备把我自己开发的淘客系统接入滴滴联盟平台,做打车优惠券搞佣金。 由于淘客系统本身是PHP开发的,所以只能采用PHP的代码接入滴滴联盟Api 下面把滴滴联盟签名生成和接口调用的代码分享给大家  

    2024年02月08日
    浏览(72)
  • 小程序生成分享海报图片并保存相册

    最近开发的小程序都有分享需求,功能大体为点击分享按钮,或主动生成海报后,用户操作保存对应海报为图片实现分享。以下是具体实现。 最终生成效果如图: 此处主要是生成工具库来生成普通二维码,如果要生成小程序码,只能通过后台接口调用开放API实现,且需要小

    2024年02月16日
    浏览(68)
  • uniapp 微信小程序 动态生成海报分享朋友圈,需先保存图片

    直接拷贝代码,不使用插件,自己纯代码实现。 从相册 或拍照 选择一个图片做海报背景。 大吉大利 今晚吃鸡。

    2024年02月11日
    浏览(90)
  • 前端生成分享海报的几种方法

    1,使用painter插件    适用于微信小程序及uniapp的小程序端 ①,引入插件painter    克隆地址:https://gitcode.net/mirrors/Kujiale-Mobile/Painter    下载的 painter 放到微信小程序的 components 目录下 ②在json文件中引入 \\\"usingComponents\\\": {         \\\"painter\\\":\\\"/components/painter/painter\\\" }, 注:在u

    2024年02月21日
    浏览(72)
  • 【微信小程序】用painter插件生成海报分享朋友圈简单教程

    第一步:去Git下载插件 1.这是核心插件 需要下载全部内容 2.官方文档 3.新建painter文件夹放到下面 4.在引用文件的json文件引用一下 5.在使用文件里创建个canvas.js文件 获取canvas.js内容去这个网站 先点击导出,在点击复制,复制到canvas.js文件里(替换) 6.然后在对应page页面的

    2024年02月10日
    浏览(73)
  • php 文字生成图片保存到本地

    你可以使用PHP的GD库来生成图片并保存到本地。首先,你需要确保你的PHP环境已经安装了GD库。然后,你可以使用GD库的函数来创建一个画布,并在上面绘制文字。最后,使用`imagepng`或`imagejpeg`函数将画布保存为PNG或JPEG格式的图片文件。以下是一个简单的示例代码: ```php ?ph

    2024年02月10日
    浏览(54)
  • 小程序使用canvas标签生成海报并保存图片

    先说一下做功能前的感受,简直一脸懵逼,第一次用canvas,只知道是个画布,其余什么都不知道…琢磨了一天才画出来… 开始之前百度了很久,想看看别人怎么写的,但是目前网上基本上用的都是wx.createCanvasContext这个api,但是这个api已经停止维护了,要求使用canvas代替,  

    2024年02月11日
    浏览(76)
  • 微信小程序使用canvas生成分享海报功能复盘

    近期需要开发一个微信小程序生成海报分享的功能。在h5一般都会直接采用 html2canvas 或者 dom2image 之类的库直接处理。但是由于小程序不具备传统意义的dom元素,所以也没有办法采用此类工具。 所以就只能一笔一笔的用 canvas 画出来了,下面对实现这个功能中遇到的问题做一

    2024年02月16日
    浏览(70)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包