TP8 JS(html2canvas) 生成二维码并与背景图、文字组合生成分享海报

方法一:前端JS生成(推荐)

注意:

这个网页只能截图图片效果代码,其它任何html效果都不能有,不然截图就不准确

复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>网页内容转图片示例</title>
    <!-- 引入html2canvas库 -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js"></script>
</head>
<body>

<!-- 截图内容 -->
<div id="capture-target">
    <h1>欢迎来到我的网站</h1>
    <p>这是一个用于演示如何将网页内容转换成图片的例子。</p>
</div>

<!-- 按钮触发截图 -->
<button onclick="captureAndSave()">点击截图保存</button>


<script>
    // 图片下载函数,加入对图片质量的控制
    function downloadImage(dataURL, filename, quality = 1.0) {
        const link = document.createElement('a');
        link.href = dataURL;
        link.download = filename;
        link.click();
    }

    // 增强的截图并保存的函数,包含DPR调整和图片质量控制
    function captureAndSave() {
        const targetElement = document.querySelector('#capture-target');
        const dpiScale = window.devicePixelRatio || 1;
        
        html2canvas(targetElement, {
            scale: dpiScale, // 考虑设备像素比以提升清晰度
            dpi: 300, // 可选:设置DPI,对于打印或某些特定需求有用
            logging: false, // 可选:关闭日志,减少噪音
        }).then(canvas => {
            // 将canvas转换为dataURL时,可以进一步控制图片质量,这里以PNG为例不直接涉及质量参数,但您可以根据所选库的具体功能调整
            const imageDataURL = canvas.toDataURL('image/jpeg', 0.95); // 示例中假设使用JPEG并设定一个较高质量,实际应根据需求调整
            downloadImage(imageDataURL.replace("image/jpeg", "image/octet-stream"), 'screenshot.jpg', 0.95); // 更改MIME类型以适应某些浏览器的下载需求
            // 或者如果坚持使用PNG且库支持质量控制,则需查找相应参数或后处理方法
        }).catch(error => {
            console.error('截图时发生错误:', error);
        });
    }
</script>

方法二:后端生成(没有测试)

复制代码
	/**
	* @name 生成海报
	* @author 峰神
	* @date 2024-06-28
	* @param array $postData 必填 提交数组
	* @param  int [必填/选填] type 生成类型 默认0=伪直播邀请海报
	* @ruturn array
	*/
	public function CreatePoster(array $postData=[],int $type=0){
		$tmp_bg_image = 'static/images/live_share.png';//背景图路径

        //获取二维码,调用了上边那个方法
        $qrcode_img = 'static/images/portrait.png';
        // $qr_res = $this->extendQrcode();
        // if($qr_res['status']){
        //     $qrcode_img = $qr_res['data'];
        // }

        //新文件名
        $share_path = 'upload/share/';
        is_dir($share_path) OR mkdir($share_path, 0777, true);
        $share_img = $share_path.'1.jpg';
		
        $this->composite_picture($tmp_bg_image, $qrcode_img, $share_img, false, '', '', false, '', 150, 510); 
        //模板背景, 二维码, 海报, 二维码是否缩小, 二维码缩小的宽度,二维码缩小的高度,是否等比例缩放, 文字, 二维码在x轴的位置, 二维码在y轴的位置

       
        $result = ['status'=>true, 'data'=>$share_img];
        return json_encode($result, 320);
	}

	/*
	* 合并图片
	* @ $bg_img 背景图片
	* @ $qrcode_img 二维码图片
	* @ $new_filename 新文件名
	* @ $is_suoxiao 组合的图片是否缩小
	* @ $n_w 缩小的宽
	* @ $n_h 缩小的高
	* @ $is_per 是否按比例缩小
	* @ $text 文字
	* @ $s_width 要组合的图片在x轴的位置
	* @ $s_height 要组合的图片在y轴的位置
	*/
	public function composite_picture($bg_img, $qrcode_img, $new_filename, $is_suoxiao, $n_w='', $n_h='', $is_per=false, $text='', $s_width='0', $s_height='0'){
		
		if($is_suoxiao){
			$src_im = $this->imgsuoxiao($qrcode_img, $n_w, $n_h, $is_per);
		}else{
			$src_im = $qrcode_img;
		}
		
		$bgimg = imagecreatefromstring(file_get_contents($bg_img));//背景图
		$src = imagecreatefromstring(file_get_contents($src_im));//组合图
		list($src_w, $src_h) = getimagesize($src_im);

		imagecopy($bgimg, $src, $s_width, $s_height, 0, 0, $src_w, $src_h);

		list($bgimg_w, $bgimg_h, $bgimg_type) = getimagesize($bg_img);

		switch ($bgimg_type) {
			case 1://GIF
				header('Content-Type: image/gif');
				header('Content-Disposition: inline; filename="image.gif"');
				$result = imagegif($bgimg, $new_filename);
				break;
			case 2://JPG
				header('Content-Type: image/jpeg');
				header('Content-Disposition: inline; filename="image.jpg"');
				imagejpeg($bgimg, $new_filename);
				break;
			case 3://PNG
				header('Content-Type: image/png');
				header('Content-Disposition: inline; filename="image.png"');
				imagepng($bgimg, $new_filename);
				break;
			default:
				break;
		}
		imagedestroy($bgimg);
		imagedestroy($src);
		if($text){
			$newss = $this->numimage($text,$new_filename,15,3,230,720);
			return $newss;
		}else{
			return $new_filename;
		}
		
		return $new_filename;
		// exit;
	}

	//缩小图片
	public function imgsuoxiao($filename, $n_w, $n_h, $is_per=false){
		list($width, $height, $dst_type)=getimagesize($filename);
		if($is_per){
			$per=0.3;
			$n_w=$width*$per;
			$n_h=$height*$per;
		}
		switch ($dst_type) {
			case 2://JPG
				$img=imagecreatefromjpeg($filename);
				break;
			case 3://PNG
				$img = imagecreatefrompng($filename);
				break;
			default:
				break;
		}
		$new=imagecreatetruecolor($n_w, $n_h);
		//copy部分图像并调整
		imagecopyresized($new, $img,0, 0,0, 0,$n_w, $n_h, $width, $height);
		//图像输出新图片、另存为
		imagejpeg($new, $filename);
		imagedestroy($new);
		imagedestroy($img);
		return $filename;
	}


	/**
	* 像图片中添加文字
	* @param $txt 文本文字
	* @param $image 图片路径
	* @param $size  文字大小
	* @param $scale 文字旋转度
	* @param $x 在x轴上的位置
	* @param $y 在y轴上的位置
	* @param $color 字体颜色
	*/
	public function numimage($txt,$image,$size,$scale,$x,$y, $color="黑色")
	{
		list($dst_w, $dst_h, $dst_type) = getimagesize($image);
		switch ($dst_type) {
			case 2://JPG
				$im = imagecreatefromjpeg($image);
				break;
			case 3://PNG
				$im = imagecreatefrompng($image);
				break;
			default:
				break;
		}
		$textcolor = imagecolorallocate($im, 0, 0, 0);
		if($color=="白色"){
			$textcolor = imagecolorallocate($im, 255, 255, 255);
		}
		$qr_size = imagesx($im);
		$font = realpath('static/STSONG.TTF'); //引入字体
		imagettftext($im, $size,0,$x,$y, $textcolor, $font, $txt);
		$myImage = ImageCreate(245,245); //参数为宽度和高度
		imagecopyresampled($myImage, $im, 0, 0, 0, 0, 0, 80, 10, 10); //重新组合图片并调整大小
		header("Content-type: image/jpeg");
		imagejpeg($im, $image);
		imagedestroy($im);
		return $image;
	}

Thinkphp5 生成二维码并与背景图、文字组合生成分享海报_tp5+phpqrcode二维码下方带文字-CSDN博客

相关推荐
两个人的幸福8 天前
Windows 桌面应用自研 PHP 队列(下):完整代码与六大工程化优化
php
BingoGo10 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
JaguarJack10 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
用户30745969820711 天前
PHP 扩展——从入门到理解
php
鹏仔先生11 天前
拷贝漫画APP下载页PHP程序,后台带免费AI写作
php
云水一下12 天前
从零开始学 PHP 系列(一):PHP 的前世今生与开发环境搭建
开发语言·php
xingpanvip12 天前
星盘接口开发文档:本命盘接口指南
android·开发语言·css·php·lua
酉鬼女又兒12 天前
零基础入门计算机网络运输层:端到端通信核心作用、端口号分类规则、复用分用工作机制及UDP与TCP协议全方位对比详解
网络·网络协议·tcp/ip·计算机网络·考研·udp·php
dog25012 天前
不要再继续优化 TCP
网络协议·tcp/ip·php
Channing Lewis12 天前
PHP 解析 Excel 的那些坑:一次“行号错位”引发的数据丢失
开发语言·php·excel