TP8 JS(html2canvas) 把DIV內容生成二維碼并與背景圖、文字組合生成分享海報

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

注意:

1.這個網頁只能截圖圖片效果代碼,其它任何html效果都不能有,不然截圖就不準確

2.如果要生成的圖片DIV內容中引用了第三個方的圖片,就是不使用同一個域名下的圖片,需要把后端把圖片轉為Base64才可以生成截圖、不然會造成跨域的問題,生成的圖片會是空白的

圖片轉為Base64后的顯示方式:

<img src="data:image/jpeg;base64,{$PosterParameters['imgp_Base64']}" />

例子:

      <div class="container" id="capture-target"><div class="img">{notempty name="$PosterParameters['img_Base64']"}<img src="data:image/jpeg;base64,{$PosterParameters['img_Base64']}" />{/notempty}</div><div class="username"><p>{notempty name="$PosterParameters['name']"}{$PosterParameters['name']}{/notempty}</p></div><div class="invite_text"><p>{notempty name="$PosterParameters['invite_text']"}{$PosterParameters['invite_text']}{/notempty}</p></div><div class="live_time_day"><p>{notempty name="$PosterParameters['day']"}{$PosterParameters['day']}{/notempty}</p></div><div class="live_time"><p>{notempty name="$PosterParameters['hi']"}{$PosterParameters['hi']}{/notempty}</p></div><div class="imgp">{notempty name="$PosterParameters['imgp_Base64']"}<img src="data:image/jpeg;base64,{$PosterParameters['imgp_Base64']}" />{else /}{notempty name="$PosterParameters['imgp']"}<img src="{$PosterParameters['imgp']}" />{/notempty}{/notempty}</div><div class="title"><p id="myDiv">{notempty name="$PosterParameters['title']"}{$PosterParameters['title']}{/notempty}</p></div><div class="qr-code"><img src="{notempty name="$PosterParameters['QRcodeUrl']"}{$PosterParameters['QRcodeUrl']}{/notempty}" width="160px" height="160px" /></div></div>
<!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) {const link = document.createElement('a');link.href = dataURL;link.download = filename;document.body.appendChild(link); // 確保元素添加到DOM中以觸發點擊事件link.click();document.body.removeChild(link); // 下載后移除元素}// 增強的截圖并保存的函數,優化參數處理與錯誤提示async function captureAndSave() {try {const targetElement = document.querySelector('#capture-target');const dpiScale = window.devicePixelRatio || 1;const qualityFactor = 0.9; // 默認質量因子,可以根據需要調整const format = 'image/png'; // 圖片輸出格式,可根據需要更改為 'image/png' 等const scale = dpiScale >= 2 ? dpiScale : 2; // 動態調整縮放比例,優先考慮DPR,至少為2以保證清晰度const canvas = await html2canvas(targetElement, {scale,dpi: 300,logging: false,useCORS: true,allowTaint: true,});// 根據圖片格式動態調整dataURL的mime類型const mimeType = format === 'image/jpeg' ? 'image/jpeg' : 'image/png';const imageDataURL = canvas.toDataURL(mimeType, qualityFactor);// 動態檢測瀏覽器對MIME類型的兼容性,必要時轉換為Blob下載if (navigator.msSaveBlob) { // IE/Edge 特殊處理const blob = await (await fetch(imageDataURL)).blob();navigator.msSaveBlob(blob, 'screenshot.' + (format === 'image/jpeg' ? 'jpg' : 'png'));} else {downloadImage(imageDataURL.replace(mimeType, 'image/octet-stream'), 'screenshot.' + (format === 'image/jpeg' ? 'jpg' : 'png'));}} catch (error) {//alert('截圖保存時發生錯誤,請檢查瀏覽器控制臺詳情。'); // 提供用戶友好提示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://GIFheader('Content-Type: image/gif');header('Content-Disposition: inline; filename="image.gif"');$result = imagegif($bgimg, $new_filename);break;case 2://JPGheader('Content-Type: image/jpeg');header('Content-Disposition: inline; filename="image.jpg"');imagejpeg($bgimg, $new_filename);break;case 3://PNGheader('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博客

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/38409.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/38409.shtml
英文地址,請注明出處:http://en.pswp.cn/web/38409.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python爬取淘寶商品評價信息實戰:從零到一的高效教程

引言&#xff1a;揭秘淘寶數據金礦 在電商領域&#xff0c;用戶評價是衡量產品優劣的金標準。作為Python爬蟲工程師&#xff0c;掌握從淘寶這座數據金礦中挖掘寶貴評價信息的技能至關重要。本文將帶你手把手實操&#xff0c;用Python爬蟲技術獲取淘寶商品的評價信息&#xff0…

Docker多階段構建Node.js應用程序

Node.js 應用程序 創建一個目錄來存放你的項目文件&#xff0c;然后在該目錄下創建以下文件。 package.json {"name": "docker-node-test","version": "1.0.0","description": "A simple Node.js app for Docker mu…

【折騰筆記】使用 PicList + Lsky Pro 對圖片進行雙重壓縮

前言 因為服務器的帶寬比較小,為了提高網站的訪問速度,網站內的圖片進行壓縮是必不可少的。另外將圖片轉換成WebP的格式可以減小文件大小、加快加載速度、支持高級特性(如透明度和動畫),以及減少存儲需求,為網站提供了顯著的性能。需要提前安裝好PicList客戶端和Lsky Pr…

最快33天錄用!一投就中的醫學4區SCI,幾乎不退稿~

【SciencePub學術】今天小編給大家推薦2本生物醫學領域的SCI&#xff0c;此期刊為我處目前合作的重點期刊&#xff01;影響因子0-3.0之間&#xff0c;最重要的是審稿周期較短&#xff0c;對急投的學者較為友好&#xff01; 醫學醫藥類SCI 01 / 期刊概況 【期刊簡介】IF&…

那些好用的 Vue3 的工具搭子!!【送源碼】

2020 年 9 月 18 日 Vue3 的正式發布已經過去了大約 3 年 9 個月左右&#xff01;&#xff01;&#xff01; 隨著 Vue3 版本的逐漸成熟&#xff0c;我們的前端世界也迎來了一系列令人振奮的更新和工具。Vue 生態圈的持續擴大&#xff0c;無疑為前端開發人員帶來了前所未有的便…

通過pycharm使用git和github的步驟

一、在Pycharm工具中配置集成Git和GitHub。 1.集成Git。 打開Pycharm, 點擊File-->Settins-->Version Control-->Git 然后在 Path to Git executable中選擇本地的git.exe路徑。如下圖&#xff1a; 2.集成GitHub 打開Pycharm, 點擊File-->Settins-->Version…

探索未來遠程調試新紀元——《串口網口遠程調試軟件》:無縫連接,高效調試

文章目錄 前言一、無縫連接&#xff0c;突破距離限制二、高效調試&#xff0c;提升工作效率三、安全可靠&#xff0c;保護數據安全四、用戶友好&#xff0c;簡化操作流程五、軟件地址六、遠程調試軟件 七、基本操作1、訂閱主題2、連接3、串口調試4、網口調試 八、軟件地址結束語…

PO模式登錄測試

項目實踐 登陸項目測試 get_driver import page from selenium import webdriverclass GetDriver:driver Noneclassmethoddef get_driver(cls):if cls.driver is None:cls.driver webdriver.Edge()cls.driver.maximize_window()cls.driver.get(page.url)return cls.drivercl…

Java高風險漏洞與修復之——LDAP injection(LDAP注入)

LDAP注入介紹 LDAP注入是一種攻擊技術,它可以利用應用程序中的安全漏洞對LDAP(輕量級目錄訪問協議)服務進行惡意查詢或修改操作。當應用程序未能適當地清理用戶的輸入內容,將其嵌入到LDAP查詢中時,就可能發生LDAP注入。攻擊者通過注入未經授權的指令或條件來操縱查詢結果…

【代碼隨想錄訓練營】【Day 66】【圖論-3】| 卡碼 101-104

【代碼隨想錄訓練營】【Day 66】【圖論-3】| 卡碼 101-104 需強化知識點 103&#xff0c;104 優化思路 題目 101. 孤島的總面積 此處 area 多余 def dfs(grid, x, y, area):dirs [[0, 1], [0, -1], [1, 0], [-1, 0]]m, n len(grid), len(grid[0])area[0] 1grid[x][y] …

k8s學習筆記——k8s升級

前一段時間&#xff0c;由于搭建k8s集群的硬件設備故障&#xff0c;老化導致k8s需要重裝。使用原來的kubeadm安裝方式卻發現裝不了了。查了一下官方文檔&#xff0c;說從v1.24版本之后&#xff0c;kubelet移除了容器引擎&#xff0c;容器及鏡像管理將有第三方工具來接管&#x…

Vue.js有哪些優點和缺點

Vue.js 作為一個流行的前端框架&#xff0c;具有許多優點和一些潛在的缺點。以下是 Vue.js 的一些主要優點和缺點&#xff1a; 優點&#xff1a; 輕量級和靈活性&#xff1a;Vue.js 的核心庫專注于視圖層&#xff0c;這使得它非常輕量級&#xff08;壓縮后只有幾十KB&#xff…

Web 反爬指南

本質上說&#xff0c;防抓的目的在于增加腳本或機器獲取你網站內容的難度&#xff0c;而不要影響真實用戶的使用或搜索引擎的收錄 不幸的是這挺難的&#xff0c;你需要在防抓和降低真實用戶以及搜索引擎的可訪問性之間做一下權衡。 為了防爬&#xff08;也稱為網頁抓取、屏幕…

智譜AI: ChatGLM API的使用

一、獲取API 1、打開網址&#xff1a;智譜AI開放平臺 注冊賬號登錄 2、登錄&#xff0c;查看API key (注冊后贈送100萬token&#xff0c;實名認證后多贈送400萬, 有效期一個) 二、安裝及調用 安裝質譜SDK pip install zhipuai調用方式 流式調用 from zhipuai import ZhipuA…

開放簽電子簽章,讓簽字有跡可循

開放簽&#xff08;企業版&#xff09;V2.0.5版本上線后&#xff0c;系統支持一鍵查詢電子文件的簽署操作記錄&#xff0c;支持一鍵生成詳細的簽署記錄報告&#xff0c;詳細請看下圖&#xff1a; 1、操作記錄詳情&#xff1a; 從合同發起、填寫、簽署、撤銷等環節全流程展示操…

【Linux從入門到放棄】探究進程如何退出以進程等待的前因后果

&#x1f9d1;?&#x1f4bb;作者&#xff1a; 情話0.0 &#x1f4dd;專欄&#xff1a;《Linux從入門到放棄》 &#x1f466;個人簡介&#xff1a;一名雙非編程菜鳥&#xff0c;在這里分享自己的編程學習筆記&#xff0c;歡迎大家的指正與點贊&#xff0c;謝謝&#xff01; 進…

常見反爬及應對

一&#xff0c;特殊混淆的還原 1.1 還原 AAEncode 與 JJEncode AAEncode是一種JavaScript代碼混淆算法&#xff0c;利用它&#xff0c;可以將代碼轉換成 顏文字 表示的JavaScript代碼。 去掉代碼最后的 (‘‘)&#xff0c;這是函數的自調用&#xff0c;去除后就是函數的聲明…

【CSharp】定義結構體并指定字段對齊

【CSharp】定義結構體并指定字段對齊 1.背景2.代碼3.分析1.背景 在 C# 中可以通過 StructLayout 屬性來定義結構體并指定字段對齊方式。 在 C# 中,內存對齊是指數據在內存中的排列方式,使用StructLayout 特性用于控制結構體的內存布局。其特性可以指定字段的內存排列順序(例…

【揭秘】國內十大頂尖AI大模型,引領智能科技新紀元

大模型大模型通常指的是參數量非常大、數據量也非常大的深度學習模型。這些模型由數百萬到數十億甚至更多的參數組成&#xff0c;需要海量的數據和強大的計算資源進行訓練和推理學習的模型。大模型設計的目的在于提高模型的表示能力和性能、應對復雜數據集和任務、提升泛化能力…

6、限界上下文:定義領域邊界的利器

在DDD限界上下文&#xff1a;定義領域邊界的利器領域建模和微服務建設過程中&#xff0c;會有很多項目參與者&#xff0c;包括領域專家、產品經理、項目經理、架構師、開發經理和測試經理等。對于同樣的領域知識&#xff0c;不同的參與者可能會有不同的理解。而且有的時候同一個…