React通过简单CSS属性来绘制canvas海报图片(react-canvas-poster)

写在前面

业务需要在PC+wap页面上动态生成一张海报图片,于是便有了这个基于React绘制海报的组件 (҂‾ ▵‾)σ(˚▽˚’!)/
github地址

react-canvas-poster

一个基于react+canvas通过类CSS数据生成canvas图片的组件
(・(ง •_•)ง゚✧ A super easy create canvas poster for React!)

生成效果

生成一个简单海报图片

安装

npm i react-canvas-poster

使用组件

注册
import CanvasPoster from 'react-canvas-poster';
使用
<CanvasPoster drawData={this.state.drawData} success={this.success.bind(this)}/>

// return base64类型图片文件
success(res) {}
demo数据例子

     {
        width: 360,
        height: 667,
        backgroundColor: '#fff',
        views: [
          // 绘制本地图片
          {
            type: 'image',
            url: require('./assets/bold.png'), // 远程图片可以直接改为图片地址
            top: 0,
            left: 0,
            width: 360,
            height: 667,
          },
          // 绘制带圆角+边框的图片
          {
            type: 'image',
            url: require('./assets/header.jpg'),
            top: 58,
            left: 165,
            width: 30,
            height: 30,
            borderRadius: 5,
            borderWidth: 2,
            borderColor: '#f0efefea',
          },
          // 绘制文字
          {
            type: 'text',
            content: 'react-canvas-poster简单快速的绘制canvas海报~~这是一段比较长的标题文字',
            fontSize: 14,
            color: '#f7f7f7',
            textAlign: 'center',
            top: 262,
            left: 180,
            width: 200,
            lineNum: 3,
            lineHeight: 20,
            baseLine: 'top',
          },
          // 绘制一条分割线
          {
            type: 'line',
            color: '#999',
            startX: 30,
            startY: 580,
            endX: 330,
            endY: 580,
            width: 2,
            lineCap: 'round',
          },
          // 绘制一个简易矩形
          {
            type: 'rect',
            width: 200,
            height: 200,
            x: 20,
            y: 50,
            paddingLeft: 10,
            paddingRight: 10,
            backgroundColor: '#fff',
          },
      }

API

drawData(数据)

属性 含义 类型 默认值 是否必填
width 生成图片宽度 Number
height 生成图片高度 Number
backgroundColor 背景颜色 String #ffffff
debug 是否开启调试模式 Boolean false
views 绘制核心数据(数组对象 见下表) Array

image字段(绘制图片)

属性 含义 默认值 是否必填
url 图片地址 支持远程图片 & 本地图片:require('./assets/x.png') " "
top 图片距离顶部距离 0
left 图片距离左边距离 0
width 图片宽度 0
height 图片高度 0
borderRadius 图片圆角 0
borderWidth 图片边框 0
borderColor 图片边框颜色

text字段(绘制文字)

属性 含义 默认值 可选值 是否必填
top 文字距离顶部距离 0
left 文字距离左边距离 0
content 文字内容 ''
fontSize 文字字号(px) 16
color 文字颜色 #000
baseLine 文字基线对齐 bottom top middle bottom
textAlign 文字对齐 left left center right
opacity 透明度 1 0-1
width 文字最大长度
lineNum 文字最大折行数 1
lineHeight 文字行高 0
fontWeight 文字加粗 normal 100-900
fontFamily 文字字体 Microsoft YaHei

line字段(绘制线段)

属性 含义 默认值 可选值 是否必填
startX 开始坐标X
startY 开始坐标Y
endX 结束坐标X
endY 结束坐标Y
color 线颜色 #000
width 线粗细 1
lineCap 设置结束端点样式 butt butt round square

rect字段(绘制矩形 内部可添加文字)

属性 含义 默认值 是否必填
width 矩形宽度
height 矩形高度
x 开始坐标X
y 开始坐标Y
text 文字(对象 参数见字段text)
paddingLeft 左内边距 0
paddingRight 右内边距 0
borderWidth 边框宽度 0
backgroundColor 背景颜色
borderColor 边框颜色
borderRadius 圆角 0
opacity 透明度 1

方法

success(src) {
  // 返回base64图片
  console.log(src)
}

注意

关于canvas图片跨域

图片跨域暂时未完全解决,远程图片地址推荐使用同域名,不然会报错

相关参考

  1. vue-canvas-poster 作者:也是俺自己
  2. canvas图片跨域怎么办
  3. wxa-plugin-canvas 作者:jasondu
  4. 绘制圆角矩形 作者:YvetteLau
  5. 贝塞尔曲线 作者:hujiulong

持续开发中的功能...

  • box-shadow 绘制阴影
  • QrCode 绘制二维码
  • Bezier curve 贝塞尔曲线
  • 可选类型图片导出
  • ...

如果你觉得这个项目有趣 不妨给个star~ (҂‾ ▵‾)σ(˚▽˚’!)/

给我star~

交流

有什么意见,或者bug 或者想一起开发react-canvas-poster
我的微信

ISS

提iss

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

推荐阅读更多精彩内容