移动端Html5页面生成图片解决方案

现在有很多微信公众号运营活动,都有生成图片的需求,生成图片后可以发送给好友和发到朋友圈扩散,利于产品的宣传!

1.生成图片可以用canvas,但是由于已经有了html2canvas这个开源库,所以为了节省时间就没有自己写了

github地址: html2canvas

少啰嗦,先看东西!!!

LiveDemo

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

/**

     * 根据window.devicePixelRatio获取像素比

     */

    function DPR() {

        if (window.devicePixelRatio && window.devicePixelRatio > 1) {

            return window.devicePixelRatio;

        }

        return 1;

    }

    /**

     *  将传入值转为整数

     */

    function parseValue(value) {

        return parseInt(value, 10);

    };

    /**

     * 绘制canvas

     */

    async function drawCanvas (selector) {

        // 获取想要转换的 DOM 节点

        const dom = document.querySelector(selector);

        const box = window.getComputedStyle(dom);

        // DOM 节点计算后宽高

        const width = parseValue(box.width);

        const height = parseValue(box.height);

        // 获取像素比

        const scaleBy = DPR();

        // 创建自定义 canvas 元素

        var canvas = document.createElement('canvas');

        // 设定 canvas 元素属性宽高为 DOM 节点宽高 * 像素比

        canvas.width = width * scaleBy;

        canvas.height = height * scaleBy;

        // 设定 canvas css宽高为 DOM 节点宽高

        canvas.style.width = `${width}px`;

        canvas.style.height = `${height}px`;

 

        // 获取画笔

        const context = canvas.getContext('2d');

 

        // 将所有绘制内容放大像素比倍

        context.scale(scaleBy, scaleBy);

 

        let x = width;

        let y = height;

        return await html2canvas(dom, {canvas}).then(function () {

            convertCanvasToImage(canvas, x ,y)

        })

    }

 

    /**

     * 图片转base64格式

     */

    function convertCanvasToImage(canvas, x, y) {

        let image = new Image();

        let _container = document.getElementsByClassName('container')[0];

        let _body = document.getElementsByTagName('body')[0];

        image.width = x;

        image.height = y;

        image.src = canvas.toDataURL("image/png");

        _body.removeChild(_container);

        document.body.appendChild(image);

        return image;

    }

    drawCanvas('.container')

2.由于现在的手机都是高清屏,所以如果你不做处理就会出现模糊的情况,为什么会出现模糊的情况?这个就涉及到设备像素比 devicePixelRatio js 提供了 window.devicePixelRatio 可以获取设备像素比

?

1

2

3

4

5

6

function DPR() {

        if (window.devicePixelRatio && window.devicePixelRatio > 1) {

            return window.devicePixelRatio;

        }

        return 1;

    }

这个DPR函数就是获取设备的像素比, 那获取像素比之后要做什么呢?

?

1

2

3

4

5

6

7

8

9

10

11

12

13

var canvas = document.createElement('canvas');

        // 设定 canvas 元素属性宽高为 DOM 节点宽高 * 像素比

        canvas.width = width * scaleBy;

        canvas.height = height * scaleBy;

        // 设定 canvas css宽高为 DOM 节点宽高

        canvas.style.width = `${width}px`;

        canvas.style.height = `${height}px`;

 

        // 获取画笔

        const context = canvas.getContext('2d');

 

        // 将所有绘制内容放大像素比倍

        context.scale(scaleBy, scaleBy);

3.获取设备像素比之后将canavs.width 和 canvas.height 去乘以设备像素比 也就是 scaleBy; 这个时候在去设置canvas.style.width 和 canvas.style.height 为dom的宽和高。想想为什么要这么写?最后在绘制的饿时候将所绘制的内容放大像素比倍

举个例子iphone6S是设备宽高是375 X 667 ,6S的 window.devicePixelRatio = 物理像素 / dips(2=750/375)所以设计师一般给你的设计稿是不是都是750*1334的?所以如果按照一比一去绘制在高清屏下就会模糊,看图说话6S DPR=2

6plus DPR=3

4.最后调用canvas.toDataURL("image/png");赋值给image.src,由于微信里面无法保存图片,所以只能生成图片文件,调用微信自带的长按保存到图片到相册功能,如图:

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用vue-esign生成图片,首先需要在main.js中引入vue-esign插件。可以通过以下代码实现引入: `import vueEsign from 'vue-esign'` `Vue.use(vueEsign)` 然后,在Vue组件中,你可以通过定义一些数据和方法来实现生成图片的功能。比如在data中定义lineWidth(线的宽度)、lineColor(线的颜色)、bgColor(背景颜色)、resultImg(结果图片)和isCrop(是否裁剪)等属性。在methods中,可以定义一些方法来处理相关的逻辑。例如,handleReset方法用于清空画布,handleGenerate方法用于生成图片。 以下是一个示例代码: ``` data() { return { lineWidth: 6, lineColor: '#000000', bgColor: '', resultImg: '', isCrop: false } }, methods: { // 清空画布 handleReset() { this.$refs.esign.reset() }, // 生成图片 handleGenerate() { this.$refs.esign.generate().then(res => { this.resultImg = res }).catch(err => { alert(err) // 画布没有签字时会执行这里 'Not Signned' }) } } ``` 通过调用handleReset方法可以清空画布,调用handleGenerate方法可以生成图片,并将生成图片赋值给resultImg属性。请根据你的具体需求进行相应的配置和调用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [vue 实现手写电子签名/生成图片](https://blog.csdn.net/sky_sunshine_x/article/details/117784364)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [vue使用canvas实现移动端手写签名](https://download.csdn.net/download/weixin_38585666/14671345)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值