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博客

相关推荐
BingoGo1 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack1 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
JaguarJack3 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo3 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
JaguarJack4 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理5 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
QQ5110082855 天前
python+springboot+django/flask的校园资料分享系统
spring boot·python·django·flask·node.js·php
WeiXin_DZbishe5 天前
基于django在线音乐数据采集的设计与实现-计算机毕设 附源码 22647
javascript·spring boot·mysql·django·node.js·php·html5