uniapp開發微信小程序使用painter將頁面轉換為圖片并保存到本地相冊

引言

我使用到painter的原因是,在uniapp開發微信小程序時,需要將一個頁面的內容轉換成圖片保存到本地相冊。
起初在網上找到很多都是在uniapp中使用 html2canvas 網頁轉換成圖片再jspdf將圖片轉換為pdf,但是這種方式在小程序環境不支持,只在h5環境下適用,當然這個方式是可行的,可以使用webviewh5將頁面嵌入到微信小程序中,可我這個整體模塊已經在微信小程序實現了,時間上也不允許我重新再用h5開發,所以就使用painter方式,將微信小程序頁面轉換成圖片。

一、painter是什么

painter是一款微信小程序插件

painter github 鏡像網址:https://gitcode.net/mirrors/Kujiale-Mobile/Painter?utm_source=csdn_github_accelerator#
下圖是官網自己對painter的介紹。
在這里插入圖片描述

二、painter的應用場景

1.社交分享:開發者可以把用戶的個人信息、活動頁面等轉換為圖片,用戶可以將這些圖片保存到本地后分享到朋友圈,QQ空間等社交平臺。

2.電商推廣:電商平臺可以把當前商品詳情頁轉成圖片,提供給用戶分享到社交平臺上,實現商品推廣。

3.數據可視化:某些需要展現大量數據,或者復雜數據的場景,可以將數據以圖表的形式展示出來,然后使用painter將這些數據圖表轉換為圖片,提供給用戶下載使用。

4.截圖保存:例如問答、短篇小說、教程等類型的小程序,可一鍵截圖保存整頁內容。

5.生成個性化海報:如把用戶的昵稱,頭像,成就等生成一張個性化的海報提供給用戶保存,增強用戶體驗。

三、uniapp中自定義組件引用painter

uniapp中引用小程序自定義組件的方式
上面鏈接是官方教程如何在uniapp中引入自定義組件,我這里簡單記錄一下在引入微信小程序的自定義組件painter的方式。

1. 下載painter

painter下載地址
在這里插入圖片描述

下載下來之后,找到compontents文件夾下的painter文件夾,這個就是我們要使用的painter組件。
在這里插入圖片描述
在這里插入圖片描述

2. 在項目根目錄新建wxcomponents 文件夾,將下載的painter文件夾拷貝到該目錄中

┌─wxcomponents                  微信小程序自定義組件存放目錄
│   └──painter                   微信小程序自定義組件
│		├─painter.js
│		├─painter.wxml
│		├─painter.json
│		└─lib
├─pages
│  └─index
│		└─index.vue
│
├─static
├─main.js
├─App.vue
├─manifest.json
└─pages.json

在這里插入圖片描述

3. 在 pages.json 對應頁面的 style -> usingComponents 引入組件:

在這里插入圖片描述

// #ifdef APP-PLUS || H5 || MP-WEIXIN || MP-QQ"usingComponents": {"painter": "/wxcomponents/painter/painter"}
// #endif

4. 然后就可以在剛配置的頁面中使用painter了

    <painter name="合同簽訂" :scaleRatio="2" :palette="palette" @imgOK="imgOK"customStyle="position:fixed;top:-9999rpx"></painter>

四、painter的基本用法

這是官網的介紹:
在這里插入圖片描述
下面是我使用時用的一個簡單的demo
生成的圖片效果如下:
在這里插入圖片描述
代碼如下

  • template
<painter name="合同簽訂" :scaleRatio="2" :palette="palette" @imgOK="imgOK" style="position:fixed;top:-9999rpx"></painter>
<button @tap="saveImg">保存</button>
  • data
      imgSrc: '',painterStyle: {rect: {width: '710rpx',left: '20rpx',color: '#fff',borderRadius: '16rpx'},textLeft: {left: '40rpx',fontSize: '28rpx',color: '#111'},textRight: {right: '40rpx',fontSize: '28rpx',color: '#111'},textLeftTwo: {left: '180rpx',fontSize: '28rpx',color: '#111'},title: {textAlign: 'center',fontSize: '36rpx',color: '#000',width: '100%'},line: {left: '40rpx',width: '670rpx',height: '1px',color: '#eee'}}
  • computed
    // 這里是圖片內容的具體實現palette() {const palette = {width: '750rpx',height: '1200rpx',background: '#f7f7f7',views: []}const startTop = 600 // 開始的 top 值const gapSize = 50 // 間隙大小// css 使用數組形式抽離相同樣式const arr1 = [{type: 'rect', // 背景css: [{ height: '500rpx' }, this.painterStyle.rect]},{type: 'rect', // 分割線css: [{ top: '100rpx' }, this.painterStyle.line]},{type: 'rect', // 分割線css: [{ top: '200rpx' }, this.painterStyle.line]}]// 文字const arr2 = [{type: 'text',text: '民用天然氣供用氣合同',css: [{ top: `${startTop}rpx`, }, this.painterStyle.title]},{type: 'text',text: '用戶編號:',css: [{ top: `${startTop + 2 * gapSize}rpx`,}, this.painterStyle.textLeft]},{type: 'text',text: '002',css: [{top: `${startTop + 2 * gapSize}rpx`,},this.painterStyle.textLeftTwo]},{type: 'text',text: '合同編號:',css: [{ top: `${startTop + 3 * gapSize}rpx`,}, this.painterStyle.textLeft]},{type: 'text',text: '123456',css: [{top: `${startTop + 3 * gapSize}rpx`,},this.painterStyle.textLeftTwo]},]palette.views = palette.views.concat(arr1, arr2)// 如果圖片沒有顯示出來,可以把它放到 views 的末尾palette.views.push({type: 'image',url: 'https://qhyxpicoss.kujiale.com/r/2017/12/04/L3D123I45VHNYULVSAEYCV3P3X6888_3200x2400.jpg@!70q',css: {top: '48rpx',right: '48rpx',width: '192rpx',height: '192rpx',},})return palette},
  • methods
    // 圖片生成成功,可以從 e.detail.path 獲取生成的圖片路徑imgOK(e) {console.log('e', e)this.imgSrc = e.detail.pathconsole.log('imgSrc', this.imgSrc) // 點擊打印出來的內容就可以看見圖片了},// 保存圖片saveImg() {//用戶授權并開啟保存到相冊的權限uni.authorize({scope: 'scope.writePhotosAlbum',success: (result) => {if (!this.imgSrc) {return uni.showToast({title: '圖片生成中,請稍等~',icon: 'none'})}// 保存到手機相冊uni.saveImageToPhotosAlbum({filePath: this.imgSrc,success: function (e) {console.log('保存成功', e)uni.showToast({title: '保存成功',icon: 'none'})}})},fail: (error) => {uni.showModal({title: '提示',content: '檢測到您有未開啟的權限,為保證功能正常使用,請保持保存到相冊權限均為開啟狀態',confirmText: '去開啟',success: ({ confirm }) => {if (confirm) uni.openSetting()}})}})},

這只是最基礎的用法,更多需求可參考官網。

總結

好啦,以上就是如何在UniApp開發環境中使用Painter插件將微信小程序頁面轉換為圖片并保存至本地相冊。首先,我們描述了安裝和配置Painter的詳細步驟,包括如何在項目中引入Painter以及編寫Painter繪圖的JSON數據。然后,我們重點介紹了如何使用PainterCanvas上繪制出需要的圖片,包括文字,圖片,矩形等元素,并詳細解說了如何具體控制這些元素的繪制位置,大小和樣式。最后,我們介紹了怎樣通過微信小程序的API,將這個繪制出來的Canvas圖片保存到用戶的本地相冊中。希望看到這里的小伙伴,這篇記錄對你有所幫助

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

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

相關文章

opencv進階08-K 均值聚類cv2.kmeans()介紹及示例

K均值聚類是一種常用的無監督學習算法&#xff0c;用于將一組數據點分成不同的簇&#xff08;clusters&#xff09;&#xff0c;以便數據點在同一簇內更相似&#xff0c;而不同簇之間差異較大。K均值聚類的目標是通過最小化數據點與所屬簇中心之間的距離來形成簇。 當我們要預測…

opencv實現以圖搜圖

這里寫目錄標題 1. 步驟1.1 導入OpenCV庫&#xff1a;1.2 加載圖像1.3 提取特征1.4 匹配特征1.5 顯示結果 2. 完整代碼3. 測試圖片及效果 1. 步驟 1.1 導入OpenCV庫&#xff1a; 在您的C代碼中&#xff0c;首先需要導入OpenCV庫。您可以使用以下語句導入核心模塊&#xff1a;…

人工智能算法-SVM, KNN

目錄 SVM, KNN區別 一、KNN算法概述 算法的描述: 二、關于K的取值 K的取法: 三、關于距離的選取 Euclidean Distance 定義: 四、總結 SVM, KNN區別

化繁為簡,使用Hibernate Validator實現參數校驗

前言 在之前的悅享校園的開發中使用了SSM框架&#xff0c;由于當時并沒有使用參數參數校驗工具&#xff0c;方法的入參判斷使用了大量的if else語句&#xff0c;代碼十分臃腫&#xff0c;因此最近在重構代碼時&#xff0c;將框架改為SpringBoot后&#xff0c;引入了Hibernate V…

有一種新型病毒在 3Ds Max 環境中傳播,如何避免?

3ds Max渲染慢&#xff0c;可以使用渲云渲染農場&#xff1a; 渲云渲染農場解決本地渲染慢、電腦配置不足、緊急項目渲染等問題&#xff0c;可批量渲染&#xff0c;批量出結果&#xff0c;速度快&#xff0c;效率高。 此外3dmax支持的CG MAGIC插件專業版正式上線&#xff0c;…

機器學習筆記(1):機器學習入門的概念

導航 一、 人工智能&#xff0c;機器學習&#xff0c;深度學習和傳統學習二、數學基礎三、編程語言 如果你剛剛入門機器學習&#xff0c;會接觸到了非常多的概念。比如人工智能&#xff0c;機器學習&#xff0c;深度學習&#xff0c;神機網絡&#xff0c;強化學習&#xff0c;各…

0基礎學習VR全景平臺篇 第85篇:智慧眼-如何分配角色的權限?

一、功能說明 角色權限&#xff0c;是指給智慧眼的所有角色成員分配具體的操作權限。 二、后臺編輯界面 1、點擊“添加權限”&#xff0c;選擇其可操作的“權限”。注意權限只能逐項選擇&#xff0c;所以如果某個角色擁有多項權限的話&#xff0c;那么需要進行多次添加。“快…

uniapp app 實現右上角回首頁;點homeButton返回上一頁;onNavigationBarButtonTap不生效問題

場景&#xff1a; app&#xff0c;Android移動端 實現點擊右上角圖標&#xff0c;回首頁。 問題&#xff1a;用了官網的 homeButton&#xff0c;圖標正常展示了&#xff0c;也可點擊&#xff0c;但每次點擊后是會返回上一頁而非首頁。 后來查到說&#xff0c;要結合onNavigatio…

linux兩臺服務器互相備份文件(sshpass + crontab)

crontab crontab是linux系統自帶的定時調度軟件&#xff0c;可用于設置周期性被執行的指令&#xff0c;一般用在每天的非高峰負荷時間段運行作業&#xff0c;可在無需人工干預的情況下運行作業。支持在一周或一月中的不同時段運行。 crontab命令允許用戶提交、編輯或刪除相應的…

滴滴Ceph分布式存儲系統優化之鎖優化

摘自&#xff1a;https://mp.weixin.qq.com/s/oWujGOLLGItu1Bv5AuO0-A 2020-09-02 21:45 0.引言 Ceph是國際知名的開源分布式存儲系統&#xff0c;在工業界和學術界都有著重要的影響。Ceph的架構和算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat…

Transformers架構系列---transformers庫的使用

Transformers最初是由Google發布的論文 Attention is All You Need (2017) 提出的一種新的深度學習網絡架構,這篇論文證明了序列模型(如 LSTM)可以完全被注意力機制取代,甚至可以獲得更好的性能。Transformers網絡結構自2017年提出之后僅僅一兩年的時間內就一直在NLP領域及…

Vue:使用Promise.all()方法并行執行多個請求

在Vue中&#xff0c;可以使用Promise.all()方法來并行執行多個請求。當需要同時執行多個異步請求時&#xff0c;可以將這些請求封裝為Promise對象并使用Promise.all()方法來執行它們。 示例1&#xff1a; 以下是一個示例代碼&#xff0c;展示了如何通過Promise.all()方法并行…

C語言——動態內存管理

動態內存管理詳解 前言&#xff1a;一、為什么存在動態內存分配二、動態內存函數2.1malloc函數2.2calloc函數2.3realloc函數2.4free函數 三、常見的動態內存錯誤3.1 對NULL指針解引用操作3.2 對動態開辟空間的越界訪問3.3 對非動態開辟內存使用free釋放3.4 使用free釋放動態開辟…

Unity UI內存泄漏優化

項目一運行&#xff0c;占用的內存越來越多&#xff0c;不會釋放&#xff0c;導致GC越來越頻繁&#xff0c;越來越慢&#xff0c;這些都是為什么呢&#xff0c;今天從UI方面談起。 首先讓我們來聊聊什么是內存泄漏呢&#xff1f; 一般來講內存泄漏就是指我們的應用向內存申請…

Rabbitmq消息不丟失

目錄 一、消息不丟失1.消息確認2.消息確認業務封裝2.1 發送確認消息測試2.2 消息發送失敗&#xff0c;設置重發機制 一、消息不丟失 消息的不丟失&#xff0c;在MQ角度考慮&#xff0c;一般有三種途徑&#xff1a; 1&#xff0c;生產者不丟數據 2&#xff0c;MQ服務器不丟數據…

設計HTML5列表和超鏈接

在網頁中&#xff0c;大部分信息都是列表結構&#xff0c;如菜單欄、圖文列表、分類導航、新聞列表、欄目列表等。HTML5定義了一套列表標簽&#xff0c;通過列表結構實現對網頁信息的合理排版。另外&#xff0c;網頁中還包含大量超鏈接&#xff0c;通過它實現網頁、位置的跳轉&…

C語言“牽手”微店商品詳情數據方法,微店商品詳情API接口申請指南

微店平臺的商品詳情通常包括以下信息&#xff1a; 商品名稱&#xff1a;展示商品的名稱&#xff0c;用于描述商品的特性和分類。 商品圖片&#xff1a;展示商品的圖片&#xff0c;可以有多張圖片以展示不同角度和細節。 商品價格&#xff1a;顯示商品的銷售價格&#xff0c;可…

nodejs服務后臺持續運行三種方法

nodejs服務后臺持續運行三種方法 一、利用 forever 推薦 forever是一個nodejs守護進程&#xff0c;完全由命令行操控。forever會監控nodejs服務&#xff0c;并在服務掛掉后進行重啟。 1、安裝 forever npm install forever -g 2、啟動服務 service forever start 3、使用…

小程序CSS button按鈕自定義高度之后不居中

問題&#xff1a; 按鈕設置高度后不居中 <view><button class"btn1" size"">Save</button> </view> page {font-size: 30rpx; }.btn1 {margin-top: 100rpx;height: 190rpx;background: linear-gradient(90deg, #FF8A06, #FF571…