uni-app 海报

海报方案

目前主要的方案有:

  • 服务端生成

  • 客户端生成

  • 服务端 + 客户端

一、客户端生成方案对比

1.1 爸妈搜海报

功能特色

  • 支持图片类型
  • 支持文字类型
  • 支持图片圆形裁剪

使用方法

  • 1、 在微信小程序管理后台——设置——第三方服务,按 AppID(wxbf07f0f22c6c200d)搜索到该插件并申请授权。

  • 2、在小程序项目中的 pages.json 文件中引入插件声明。

    "plugins": {
        "poster": {
            "version": "1.0.0",
            "provider": "wxbf07f0f22c6c200d"
        }
    }
    
  • 3、在需要使用到该插件的小程序页面的配置文件中,做以下配置:

    "usingComponents": {
        "poster": "plugin://poster/poster"
    }
    
  • 4、在相应的 vue 页面中添加以下语句即可完成插件的嵌入。

    <poster :drawing="drawing" :savebtnText="savebtnText" canvas-style="canvas-style" savebtn-style="savebtn-style"/>
    

<details><summary>例子代码(点击展开)</summary>

drawing: [{
        type: 'image',
        url: 'https://i.loli.net/2018/10/30/5bd85117675b3.png',
        left: 0,
        top: 0,
        width: 650,
        height: 960
    },
    {
        type: 'text',
        content: '咖啡',
        fontSize: 26,
        color: 'white',
        textAlign: 'left',
        left: 170,
        top: 50,
        width: 650
    }
]

</details>

1.2 Painter

功能特色

  • borderWidth 和 borderColor 属性支持,可设置边框
  • image 加入 mode 属性
  • fontFamily 属性支持
  • 支持渐变色
  • 支持 box-shadow 和 text-shadow,统一使用 shadow 表示。
  • text 加入 background 属性。
  • 可获取 text 的宽度
  • 支持元素的相对定位方法
  • 可通过文本中的换行符进行主动换行
  • 生成的图片支持分辨率调节

使用 Painter

  • 1、 引入代码

    Painter 的核心代码在另一个 repo 中。你可以通过 submodule 的方式进行库的引入。有关 submodule 的用法可自行 Google。

    git submodule add https://github.com/Kujiale-Mobile/PainterCore.git wxcomponents/painter
    
  • 2、 作为自定义组件引入,注意目录为第一步引入的代码所在目录

    "usingComponents":{
        "painter": "/wxcomponents/painter/painter"
    }
    
  • 3、 组件接收 palette 字段作为画图数据的数据源, 图案数据以json形式存在,推荐使用“皮肤模板”的方法进行传递,示例代码如下:

    <painter :customStyle="customStyle" @imgOK="onImgOk" :palette="template" :dirty="true" />
    

    你可以通过设置 widthPixels 来强制指定生成的图片的像素宽度,否则,会根据你画布中设置的大小来动态调节,比如你用了 rpx,则在 iphone 6 上会生成 0.5 倍像素的图片。由于 canvas 绘制的图片像素直接由 Canvas 本身大小决定,此处通过同比例放大整个画布来实现对最后生成的图片大小的调节。

    <painter :customStyle="customStyle" @imgOK="onImgOk" :palette="template" :dirty="true" widthPixels="1000"/>
    
  • 4、 数据传入后,则会自动进行绘图。绘图完成后,你可以通过绑定 imgOK 或 imgErr 事件来获得成功后的图片 或失败的原因。

    @imgOK="onImgOK"
    @imgErr="onImgErr"
    
    onImgOK(e) {
        // 其中 e.detail.path 为生成的图片路径
    },
    

<details><summary>例子代码(点击展开)</summary>

template: {
    width: '654rpx',
    height: '600rpx',
    background: '#eee',
    views: [{
            type: 'rect',
            css: {
                top: '40rpx',
                left: '327rpx',
                color: 'rgba(255, 0, 0, 0.5)',
                width: '5rpx',
                height: '500rpx'
            }
        },
        {
            type: 'image',
            url: '/palette/avatar.jpg',
            css: {
                top: '40rpx',
                left: '327rpx',
                width: '100rpx',
                height: '100rpx'
            }
        },
        {
            type: 'qrcode',
            content: '/palette/avatar.jpg',
            css: {
                top: '180rpx',
                left: '327rpx',
                width: '120rpx',
                height: '120rpx'
            }
        },
        {
            type: 'text',
            text: "align: 'left' 或者不写",
            css: {
                top: '320rpx',
                left: '327rpx',
                fontSize: '30rpx'
            }
        }
    ]
}

</details>

1.3 wxa-plugin-canvas

功能特色

  • borderWidth 和 borderColor 属性支持,可设置边框
  • borderRadius 圆角支持
  • 图片支持
  • 文字支持
  • 块状支持
  • zindex 层级支持
  • 下划线支持
  • 生成的图片支持分辨率调节

使用方法

  • 1、引入代码

    直接通过 git 下载 wxa-plugin-canvas 源代码,并将miniprogram_dist目录拷贝到自己的项目组件目录中

  • 2、作为自定义组件引入

    "usingComponents": {
        "poster": "/wxcomponents/wxa-plugin-canvas/poster",
    }
    
  • 3、在相应的 vue 页面中添加以下语句即可完成插件的嵌入。

    <poster id="poster" :config="posterConfig" @success="onPosterSuccess" @fail="onPosterFail">
        <button>点击生成海报</button>
    </poster>
    

<details><summary>例子代码(点击展开)</summary>

posterConfig: {
    width: 750,
    height: 1334,
    backgroundColor: '#fff',
    debug: false,
    pixelRatio: 1,
    blocks: [{
            width: 690,
            height: 808,
            x: 30,
            y: 183,
            borderWidth: 2,
            borderColor: '#f0c2a0',
            borderRadius: 20
        },
        {
            width: 634,
            height: 74,
            x: 59,
            y: 770,
            backgroundColor: '#fff',
            opacity: 0.5,
            zIndex: 100
        },
    ],
    texts: [{
            x: 30,
            y: 113,
            baseLine: 'top',
            text: '发现一个好物,推荐给你呀',
            fontSize: 38,
            color: '#080808'
        },
        {
            x: 59,
            y: 895,
            baseLine: 'middle',
            text: [{
                    text: '2人拼',
                    fontSize: 28,
                    color: '#ec1731'
                },
                {
                    text: '¥99',
                    fontSize: 36,
                    color: '#ec1731',
                    marginLeft: 30
                }
            ]
        },
        {
            x: 522,
            y: 895,
            baseLine: 'middle',
            text: '已拼2件',
            fontSize: 28,
            color: '#929292'
        },
        {
            x: 59,
            y: 945,
            baseLine: 'middle',
            text: [{
                    text: '商家发货&售后',
                    fontSize: 28,
                    color: '#929292'
                },
                {
                    text: '七天退货',
                    fontSize: 28,
                    color: '#929292',
                    marginLeft: 50
                },
                {
                    text: '运费险',
                    fontSize: 28,
                    color: '#929292',
                    marginLeft: 50
                }
            ]
        },
        {
            x: 360,
            y: 1065,
            baseLine: 'top',
            text: '长按识别小程序码',
            fontSize: 38,
            color: '#080808'
        },
        {
            x: 360,
            y: 1123,
            baseLine: 'top',
            text: '超值好货一起拼',
            fontSize: 28,
            color: '#929292'
        },
    ],
    images: [{
            width: 62,
            height: 62,
            x: 30,
            y: 30,
            borderRadius: 62,
            url: 'https://lc-I0j7ktVK.cn-n1.lcfile.com/02bb99132352b5b5dcea.jpg'
        },
        {
            width: 634,
            height: 634,
            x: 59,
            y: 210,
            url: 'https://lc-I0j7ktVK.cn-n1.lcfile.com/193256f45999757701f2.jpeg'
        }
    ]
}

</details>

1.4 mp_canvas_drawer

功能特色

  • 绘制文本(换行、超出内容省略号、中划线、下划线、文本加粗)
  • 绘制图片
  • 绘制矩形
  • 多图绘制

使用方法

  • 1、引入代码

    直接通过 git 下载 mp_canvas_drawer 源代码,并将 canvasdrawer 目录拷贝到自己的项目组件目录中

  • 2、作为自定义组件引入

    "usingComponents": {
        "poster": "/wxcomponents/canvasdrawer/canvasdrawer",
    }
    
  • 3、在相应的 vue 页面中添加以下语句即可完成插件的嵌入。

    <canvasdrawer :painting="painting" @getImage="eventGetImage"/>
    

<details><summary>例子代码(点击展开)</summary>

painting: {
    width: 375,
    height: 555,
    views: [{
            type: 'image',
            url: 'https://hybrid.xiaoying.tv/miniprogram/viva-ad/1/1531103986231.jpeg',
            top: 0,
            left: 0,
            width: 375,
            height: 555
        },
        {
            type: 'text',
            content: '您的好友【kuckboy】',
            fontSize: 16,
            color: '#402D16',
            textAlign: 'left',
            top: 33,
            left: 96,
            bolder: true
        },
        {
            type: 'text',
            content: '发现一件好货,邀请你一起0元免费拿!',
            fontSize: 15,
            color: '#563D20',
            textAlign: 'left',
            top: 59.5,
            left: 96
        },
        {
            type: 'image',
            url: 'https://hybrid.xiaoying.tv/miniprogram/viva-ad/1/1531385366950.jpeg',
            top: 136,
            left: 42.5,
            width: 290,
            height: 186
        },
        {
            type: 'text',
            content: '正品MAC魅可口红礼盒生日唇膏小辣椒Chili西柚情人',
            fontSize: 16,
            lineHeight: 21,
            color: '#383549',
            textAlign: 'left',
            top: 336,
            left: 44,
            width: 287,
            MaxLineNumber: 2,
            breakWord: true,
            bolder: true
        },
        {
            type: 'text',
            content: '¥0.00',
            fontSize: 19,
            color: '#E62004',
            textAlign: 'left',
            top: 387,
            left: 44.5,
            bolder: true
        },
        {
            type: 'text',
            content: '原价:¥138.00',
            fontSize: 13,
            color: '#7E7E8B',
            textAlign: 'left',
            top: 391,
            left: 110,
            textDecoration: 'line-through'
        },
        {
            type: 'text',
            content: '长按识别图中二维码帮我砍个价呗~',
            fontSize: 14,
            color: '#383549',
            textAlign: 'left',
            top: 460,
            left: 165.5,
            lineHeight: 20,
            MaxLineNumber: 2,
            breakWord: true,
            width: 125
        }
    ]
}

</details>

客户端方案总体对比

名称 爸妈搜海报 Painter wxa-plugin-canvas mp_canvas_drawer 内部开发
类型 第三方插件 自定义组件 自定义组件 自定义组件 自定义组件
平台差异说明 微信小程序 微信小程序 微信小程序 微信小程序 uni-app 平台
接入成本 简单快速 简单快速 简单快速 简单快速 自定义开发
扩展性 良好 良好 良好 --
平台迁移 不支持 需开发 需开发 需开发 支持
开发周期 较短 较短 较短 较短 根据具体需求而定

未完待续......

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342