uni-app 利用canvas生成二维码海报

算法灯塔说
• 阅读 23874

canvas生成海报并保存到手机

强烈建议大家不要入uni-app这个陨石坑...

  1. 网络图片必须保存到本地 uni.getImageInfo()或者uni.downloadFile(),推荐前者,不要在onLoad生命周期里面下载地址,必须放在生成二维码的回调里面;
  2. 网络图片必须是白名单里面,协议必须是https;
  3. 画图保存CanvasContext.drawImage必须要在CanvasContext.draw(boolean reserve, function callback)的回调函数里面;

uni-app 利用canvas生成二维码海报

演示demo:

生成二维码组件github地址:https://github.com/q310550690/uni-app-qrcode

html

<template>
    <view class="content">
        <button type="primary" @tap="saveToAlbum">保存</button>
        <view class="post">
            <tki-qrcode
                ref="qrcode"
                :val="val"
                :size="200"
                background="#fff"
                foreground="#000"
                pdground="#000"
                :onval="false"
                :loadMake="false"
                @result="qrR"
                :show="false"
            ></tki-qrcode>
            <view class="wrapper"><canvas style="height: 100%;width: 100%;backgroundColor: #FFFFFF" canvas-id="firstCanvas"></canvas></view>
        </view>
    </view>
</template>

javascript

<script>
import tkiQrcode from '@/components/qrcode/tki-qrcode.vue';
export default {
    name: 'canvas-drawer',
    components: {
        tkiQrcode
    },
    data() {
        return {
            val: 'https://www.baidu.com',
            cover: 'https://inews.gtimg.com/newsapp_bt/0/2543905722/1000'
        };
    },
    onLoad() {},
    methods: {
        qrR(path) {
            let that = this;
            this.qr_path = path;
            let system_info = uni.getSystemInfoSync();
            let ctx = uni.createCanvasContext('firstCanvas');
            uni.getImageInfo({
                src: that.cover,
                success(res) {
                    console.log(res.path);
                    ctx.drawImage(res.path, 0, 0, 375, uni.upx2px(1020));
                    let linearGrad = ctx.createLinearGradient(0, 0, 800, 0);
                    linearGrad.addColorStop('0.25', '#8b00d2');
                    linearGrad.addColorStop('0.5', '#003fb3');
                    linearGrad.addColorStop('0.75', '#ff3ef0');
                    ctx.fillStyle = '#FFFFFF';
                    ctx.fillRect(uni.upx2px(500), uni.upx2px(790), uni.upx2px(200), uni.upx2px(210));
                    ctx.drawImage(path, uni.upx2px(520), uni.upx2px(800), uni.upx2px(160), uni.upx2px(160));
                    ctx.font = '13px Arial';
                    ctx.fillStyle = '#000';
                    ctx.fillText('长按保存二维码', uni.upx2px(508), uni.upx2px(990));
                    ctx.draw(false, () => {
                        uni.canvasToTempFilePath({
                            x: 0,
                            y: 0,
                            width: 375,
                            height: uni.upx2px(1020),
                            destWidth: 375,
                            destHeight: uni.upx2px(1020),
                            canvasId: 'firstCanvas',
                            success: function(res) {
                                uni.saveImageToPhotosAlbum({
                                    filePath: res.tempFilePath,
                                    success: function() {
                                        console.log('save success');
                                    }
                                });
                            },
                            fail(e) {
                                console.log(e);
                                uni.showToast({
                                    title: '生成海报失败',
                                    icon: 'none'
                                });
                            }
                        });
                    });
                },
                fail(error) {
                    console.log(error);
                }
            });
            

            
        },
        saveToAlbum() {
            this.$refs.qrcode._makeCode();
        }
    }
};
</script>

style

<style lang="scss">
.post {
    height: 100%;
    background-color: #f4f4f4;

    .wrapper {
        height: 1020rpx;
        display: flex;
        justify-content: center;
        align-items: center;
        margin-top: 50upx;
    }
}
</style>

效果图:

uni-app 利用canvas生成二维码海报

点赞
收藏
评论区
推荐文章
小森森 小森森
2年前
计划助手V1.0-微信小程序(QQ小程序)-源代码分享
疫情期间在家感觉好无聊啊,于是利用空闲时间做了一个用来记录和管理小目标时间的小程序,命名为《小沙漏》。QQ版本小程序同步上线,QQ小程序叫《时间小沙漏》,欢迎大家前来体验,后期也会添加其他的新功能哦【区别】:微信小程序的代码与QQ小程序的源码是不一样的。微信小程序的源码基于微信小程序云开发,需要在有网络的情况下使用,具有同步功能,所有记录在删除小
不是海碗 不是海碗
2年前
AI作画—矢量插画风海报
今天我使用APISpace的AI作画(图像生成)服务生成了一些关于保护动物主题的公益海报,动物也是我们人类的好伙伴,呼吁大家保护动物,不要杀戮。希望能从我生成的海报中,带给大家一些设计元素或排版上的灵感。大家可以使用体验一下,是否可以生成自己想要的海报。
Wesley13 Wesley13
3年前
java 代码生成分享海报,仅供参考
为了生成一个活动海报,不得不根据海报底图通过java代码手动生成一张海报(包含用户名,用户简介,商品图,商品价格,商品二维码宣传语等),通过千辛万苦后,终于画成功了,我强了但也秃了,这不是因为强而秃,而是我的同事告诉我,为什么不用通过网页htmlcss写出一张海报,然后java代码通过url保存为图片(?????)  我秃了
徐小夕 徐小夕
4年前
前端如何实现一键截图功能?
前言网页截图功能目前也是非常常见的需求,尤其是在在线教育领域.我们朋友圈的微信海报,活动海报等,一般都是运营/市场人员通过设计工具设计而成,但是如何更好的
CuterCorley CuterCorley
4年前
uni-app入门教程(5)接口的基本使用
前言本文主要介绍uniapp提供的一些基础接口,包括:网络请求接口,用于通过指定的请求方法,携带特定的数据,向特定的地址请求并返回请求结果;图片处理接口,包括选择、预览、获取信息、保存到本地等接口;文件处理接口,包括文件上传和下载接口;数据缓存接口,包括以同步或异步的方式保存、获取或删除数据的接口。一、网络请求小程序要想正常运转,都需要与服务器端进
梦
4年前
微信小程序new Date()转换时间异常问题
微信小程序苹果手机页面上显示时间异常,安卓机正常问题image(https://imghelloworld.osscnbeijing.aliyuncs.com/imgs/b691e1230e2f15efbd81fe11ef734d4f.png)错误代码vardate'2021030617:00:00'vardateT
Easter79 Easter79
3年前
Taro小程序自定义顶部导航栏
微信自带的顶部导航栏是无法支持自定义icon和增加元素的,在开发小程序的时候自带的根本满足不了需求,分享一个封装好的组件,支持自定义icon、扩展dom,适配安卓、ios、h5,全面屏。我用的是京东的Taro多端编译框架写的小程序,原生的也可以适用,用到的微信/taro的api做调整就行,实现效果如下。!在这里插入图片描述(https://i
Stella981 Stella981
3年前
OFBiz 快速入门——续二
OFBiz快速入门——续二2011年03月17日星期四00:03OFBiz 快速入门2.5 创建一个文件,取名为(controller.xml),被OFBiz webapp控制器使用的。在没有额外增加功能时,这个文件内容非常的小与简单,如下:<?xml version"1.0" encoding"UTF8"?<siteco
Wesley13 Wesley13
3年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
使用taro+canvas实现微信小程序的图片分享功能 | 京东云技术团队
业务场景二轮充电业务中,用户充电完成后在订单详情页展示订单相关信息,用户点击分享按钮唤起微信小程序分享菜单,将生成的图片海报分享给微信好友或者下载到本地,好友可通过扫描海报中的二维码加群领取优惠。使用场景及功能:微信小程序生成海报图片分享好友下载图片使用技
少湖说 少湖说
6个月前
鸿蒙原生开发手记:04-一个完整元服务案例
影院热映分享一个完整的元服务案例,这个案例高仿了豆瓣的小程序。简介整个元服务分为45个页面,首页为列表页,展示了当前影院热门的电影,点开是一个详情介绍页,里面有影片详情,演职表,相关影片推荐等,热门海报。打开海报是一个完整的海报展示页,点开可以产看大图。另