手把手教你绘制小程序海报

这篇具有很好参考价值的文章主要介绍了手把手教你绘制小程序海报。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

海报分享功能在许多应用中应该是很常见的,因为它作为一种常用的应用推广和拉新的方式。

接下来看个实际的案例,如下:
手把手教你绘制小程序海报,小程序,JavaScript,Vue,小程序,uni-app,javascript

把任务拆解下:

  • 如何绘制海报
  • 如何把绘制后的海报保存到相册

绘制海报

canvas 来绘制海报。 这里需要了解基本的 canvas api,不熟悉可以先去了解下相关 Canvas API

  • 定义 canvas 元素
<template>
  <view class="poster-container">
    <canvas class="poster" canvas-id="posterId"></canvas>
    <button class="btn" @click="onSave">保存至相册</button>
  </view>
</template>
  • 获取 canvas 上下文对象
const context = uni.createCanvasContext('posterId');
  • 绘制背景图片

图片支持远程图片本地图片,网络图片要通过 getImageInfo / downloadFile 先下载。

context.drawImage('/static/poster.png', 0, 0, 320, 410); // 绘制背景图片
  • 绘制头像和昵称
    手把手教你绘制小程序海报,小程序,JavaScript,Vue,小程序,uni-app,javascript
const avatarLeft = 185;
const avatarTop = 18;
const avatarWidth = 16;
const avatarHeight = 16;
context.drawImage(
  '/static/avatar.png',
  avatarLeft,
  avatarTop,
  avatarWidth,
  avatarHeight
);

从设计上来看头像和昵称是对齐的。
手把手教你绘制小程序海报,小程序,JavaScript,Vue,小程序,uni-app,javascript

直接按照设计稿距离来设定看看效果

const nickName = '墙头草中的顶尖的';
const nameLeft = avatarLeft + avatarWidth + 7;
context.setFillStyle('#ffffff');
context.setFontSize(12);
context.fillText(nickName, nameLeft, 21, 96);

实际效果如下:
手把手教你绘制小程序海报,小程序,JavaScript,Vue,小程序,uni-app,javascript

发现与预期效果对应不上,思考下这是为什么? 文字设置距离偏移的参考基线不是文字的顶部。

怎么验证我的说法呢?可以 x 值设置为 0

const nickName = '墙头草中的顶尖的';
const nameLeft = avatarLeft + avatarWidth + 7;
context.setFillStyle('#ffffff');
context.setFontSize(12);
context.fillText(nickName, nameLeft, 0, 96); // 修改为 0

再看看效果:
手把手教你绘制小程序海报,小程序,JavaScript,Vue,小程序,uni-app,javascript

发现参考点几乎是文字的底部,这就验证了上面的结论。

怎么解决这个问题呢?

  • 获取文本行的高度
  • 更改偏移的参考点

通常知道文本行实际占用的高度,需要知道其 line-height,上面并不知道其 line-height 值。canvas 本身并不直接支持line-height属性,显然没办法获得相对准确的行高。

只能采用第二种方式,从 canvas 提供 API 来看,可以更改文本相行对齐的点。

const nickName = '墙头草中的顶尖的';
const nameLeft = avatarLeft + avatarWidth + 7;
context.setFillStyle('#ffffff');
context.setFontSize(12);
context.setTextBaseline('top'); // 更改基线对齐点
context.fillText(nickName, nameLeft, 21, 96);

再来看看效果如下:
手把手教你绘制小程序海报,小程序,JavaScript,Vue,小程序,uni-app,javascript

接下来实现二维码区域,主要白色背景 + 二维码 + 文案

  • 白色背景区域
const rectWidth = 300;
const rectHeight = 89;
const rectLeft = 10;
const rectTop = 311;
context.setFillStyle('#ffffff');
context.fillRect(rectLeft, rectTop, rectWidth, rectHeight);

效果如下:

手把手教你绘制小程序海报,小程序,JavaScript,Vue,小程序,uni-app,javascript

  • 绘制二维码
const qrcodeLeft = 20;
const qrcodeTop = rectTop + 10;
const qrcodeWidth = 68;
const qrcodeHeight = 68;
context.drawImage(
  '/static/qrcode.png',
  qrcodeLeft,
  qrcodeTop,
  qrcodeWidth,
  qrcodeHeight
);

二维码这里直接采用现成图片。实际上前端可以通过 weapp.qrcode.esm.js 在前端生成二维码,再把它绘制上去。

  • 绘制多行文本
const startX = qrcodeLeft + qrcodeWidth + 15;
const text1 = '与志同道合的,他们一起成长';
context.setFillStyle('#161413');
context.setFontSize(14);
context.setTextBaseline('top');
context.fillText(text1, startX, rectTop + 29);
const text2 = '扫码即可进入“Get一下”社区';
context.font = 'bold 14px Arial';
context.fillText(text2, startX, rectTop + 51);

看看最后的效果:

手把手教你绘制小程序海报,小程序,JavaScript,Vue,小程序,uni-app,javascript

左上角的部分没有绘制,思路同头像和昵称一样。 接下来只要把图片保存到相册即可。

保存到相册

在小程序中,提供方法支持如下:

const onSave = () => {
  // 转换为临时路径
  uni.canvasToTempFilePath({
    canvasId: 'posterId',
    success: (res) => {
      // 保存图片到相册
      uni.saveImageToPhotosAlbum({
        filePath: res.tempFilePath,
        success: () => {
          uni.showToast({
            title: '保存成功',
            icon: 'none',
          });
        },
        fail: () => {
          uni.showToast({
            title: '保存失败',
            icon: 'none',
          });
        },
      });
    },
  });
};

这里基本上把一个海报绘制

扩展

  • 在绘制名称时,用户名称长短不一至,如果名字过长时会出现什么效果呢
const nickName = '墙头草中的顶尖的墙头草中的顶尖的';
const nameLeft = avatarLeft + avatarWidth + 7;
context.setFillStyle('#ffffff');
context.setFontSize(12);
context.fillText(nickName, nameLeft, 21, 96);

手把手教你绘制小程序海报,小程序,JavaScript,Vue,小程序,uni-app,javascript

从效果来看,发现文字直接重叠。如果希望超出的部分能够通过省略号来省略,是可以的

const nickName = '墙头草中的顶尖的墙头草中的顶尖的';
const nameLeft = avatarLeft + avatarWidth + 7;
context.setFillStyle('#ffffff');
context.setFontSize(12);
context.fillText(nickName, nameLeft, 21, 96);

let text = '';
const textArr = nickName.split('');
const ellipsisWidth = context.measureText('...').width; // 省略号的宽度
for (let i = 0; i < textArr.length; i++) {
  const temp = text + textArr[i];
  const metrics = context.measureText(temp);
  if (metrics.width + ellipsisWidth > 96) {
    text = text + '...';
    break;
  }
  text = temp;
}
context.fillText(text, nameLeft, 21, 96);

上面主要是通过 measureText 方法获得文字对应宽度,针对超出的部分采用省略号替代。当然,如果希望完整地显示名字,也可以使用换行的方式。具体的实现方式,就留给大家自己思考和实现了。

处理后效果如下:
手把手教你绘制小程序海报,小程序,JavaScript,Vue,小程序,uni-app,javascript

  • 头像实现圆角

默认采用圆角头像,如果用户上传的头像没有进行裁剪处理,导致图片出现非圆角情况,那么在海报上呈现的效果可能会有所差异。

先使用一个非圆角的图片,代码修改如下:

const avatarLeft = 185;
const avatarTop = 18;
const avatarWidth = 16;
const avatarHeight = 16;
context.drawImage(
  '/static/avatar-rect.png',
  avatarLeft,
  avatarTop,
  avatarWidth,
  avatarHeight
);

效果如下:
手把手教你绘制小程序海报,小程序,JavaScript,Vue,小程序,uni-app,javascript

现在对图片处理一下:

const avatarLeft = 185;
const avatarTop = 18;
const avatarWidth = 16;
const avatarHeight = 16;
context.beginPath();
context.arc(
  avatarLeft + avatarWidth / 2,
  avatarTop + avatarHeight / 2,
  avatarWidth / 2,
  0,
  2 * Math.PI
);
context.closePath();
context.clip();
// 绘制圆形头像
context.drawImage(
  '/static/avatar-rect.png',
  avatarLeft,
  avatarTop,
  avatarWidth,
  avatarHeight
);

效果如下:
手把手教你绘制小程序海报,小程序,JavaScript,Vue,小程序,uni-app,javascript

圆角是实现了,发现其他区域内容都被裁剪了。 这是为什么? clip()改变了绘画环境。ctx()调用后,所裁剪的区域就是 clip ()后的绘制环境,clip()之后的绘画只能在裁剪区域中渲染,不能访问画布上的其他区域。

怎么处理这个问题呢 ? 通过 save()restore().

context.save(); // 暂存
context.beginPath();
context.arc(
  avatarLeft + avatarWidth / 2,
  avatarTop + avatarHeight / 2,
  avatarWidth / 2,
  0,
  2 * Math.PI
);
context.closePath();
context.clip();
// 绘制圆形头像
context.drawImage(
  '/static/avatar-rect.png',
  avatarLeft,
  avatarTop,
  avatarWidth,
  avatarHeight
);
context.restore(); // 恢复

效果如下:
手把手教你绘制小程序海报,小程序,JavaScript,Vue,小程序,uni-app,javascript

总结

  • 通过 canvas + 小程序提供 API 实现海报绘制、保存海报到相册
  • 优化特殊情况下名称和头像的展示方式。

如果您有任何疑问,请随时在评论区留言。文章来源地址https://www.toymoban.com/news/detail-759633.html

到了这里,关于手把手教你绘制小程序海报的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 手把手教你写出第一个C语言程序

    大家好,我是努力学习游泳的鱼。这篇文章将手把手带你写出人生中第一个C语言程序, Hello, World 。在阅读本文之前,建议先百度 visual studio ,在微软官网下载并安装VS的最新版本,安装时记得勾选“C++桌面开发”选项。 2.1 环境 工欲善其事必先利其器,我们需要写C语言代码

    2024年02月10日
    浏览(40)
  • 手把手教你在ARM板上写一个驱动程序!

    摘要:搞嵌入式有两个方向,一个是嵌入式软件开发(MCU方向),另一个是嵌入式软件开发(Linux方向)。其中MCU方向基本是裸机开发和RTOS开发。而Linux开发方向又分为驱动开发和应用开发。其中应用开发相比于驱动开发来说简单一些,因为搞驱动你要和Linux内核打交道。而我们普

    2024年02月01日
    浏览(74)
  • web分析-手把手教你怎么写小程序事件分析

    概述 小程序提供了自定义埋点方法,需要在业务代码中新增对应的代码。 区别于小程序已有的页面、用户等埋点,web分析中的自定义的方法往往与业务场景相关。 本文会按步骤详细介绍小程序的事件、事件分析、漏斗分析的创建流程。 该事件主要用于记录用户进入首页之后

    2024年02月10日
    浏览(34)
  • 手把手教你如何在Linux下写进度条小程序(附源码)

    录屏2023 进入ProgressBar这个目录之后,使用ls命令查看是否创建成功 编写makefile文件是为了,使用make命令构建我们的.c文件,生成可执行程序 把源码复制粘贴到我们对应的文件中 使用vim指令先打开头文件 按小写i,进入插入模式(Insert),直接拷贝上去 再按esc,直接输入:wq(

    2024年02月04日
    浏览(35)
  • 【Golang项目实战】手把手教你写一个备忘录程序|附源码——建议收藏

    博主简介: 努力学习的大一在校计算机专业学生,热爱学习和创作。目前在学习和分享:数据结构、Go,Java等相关知识。 博主主页: @是瑶瑶子啦 所属专栏: Go语言核心编程 近期目标: 写好专栏的每一篇文章 前几天瑶瑶子学习了Go语言的基础语法知识,那么今天我们就写个

    2024年02月06日
    浏览(41)
  • 手把手教你打造自己的AI聊天机器人程序(讯飞星火API)

    案例背景 最近发现科大的讯飞星火大模型可以申请API试用了,我一直想用chatgpt的API,一是因为收费买不起,二是因为网络不方便..... 现在有了科大讯飞这个国内免费的,当然要试试。 目前讯飞星火可以申请试用他们的模型API,但是只有200w的token上限(一下就能花光),而且

    2024年02月08日
    浏览(40)
  • 手把手教你实现微信小程序向特定用户推送一次性订阅消息

    目前有一个已 微信认证 的 订阅号 类型公众号,一个 微信认证 小程序,小程序和公众号互相关联。尚不清楚是否必须微信认证或特定类型,因为目前没遇到类型不匹配或相关的问题,发送微信小程序一次性订阅消息的相关限制较少 1、功能介绍 订阅消息推送位置:服务通知

    2024年02月08日
    浏览(42)
  • 手把手教你学习PyQT5:打造精美、功能强大的桌面应用程序(更新中。。)

    PyQt5是一个用于创建图形用户界面(GUI)的Python库。它是基于Qt库的,Qt是一个用于创建跨平台应用程序的C++库。PyQt5允许开发人员使用Python语言创建功能强大的应用程序 PyQt5是一个用于创建图形用户界面(GUI)的Python库。它是基于Qt库的,Qt是一个用于创建跨平台应用程序的

    2024年02月08日
    浏览(36)
  • 前端小程序,手把手教你从零开始做一个酷炫的扭蛋机十连抽动画效果

    其实没有做多复杂的效果,连 canvas 都没用上,都是一些简单的平面变换,不过一段看似复杂的动画往往都是几个简单的变换拼接而成,所以我们逐步拆解,很简单的就能得到一个扭蛋机十连抽效果。 语言环境 我这边使用的是 tailwindcss 和 ts,在 uniapp  + vue3 的情况下写的小

    2024年04月13日
    浏览(43)
  • STM32系列——手把手教你将SYN6288语音播报模块的标准库程序转为hal库使用

    目录 前言 1. 原理 2. Cubmx配置 3. keil5编写代码 3.1 main.c 3.2 syn6288.c 3.3 syn6288.h 本教程基于 stm32f103c8t6 最小系统板, hal库 开发。 操作简单,讲解直接清楚,旨在让大家少走弯路。 SYN6288就是用到一个串口资源即可,用STM32开发起来不难。 配置串口3为异步通信模式 ,注意波特率

    2024年02月07日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包