小程序实现canvas添加图文

2024-06-06 07:08
文章标签 canvas 图文 程序实现

本文主要是介绍小程序实现canvas添加图文,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

小程序实现canvas添加图文

笔者今年刚毕业,也没从业经历,难免有代码编写不成熟的地方,欢迎指正
上周开始接触小程序,这里实现的功能类似表情包制作:选择图片、输入文字后保存到本地。目前只是demo 后续会不断完善所以不是最终效果
下面是界面效果
在这里插入图片描述
该页面的data:

//字号
for(let i=12; i<32; i++)
{fontsize.push(i)
}
data: {fontsize:fontsize,sizeindex:0,textsize:0,textlength:0,imgurl:"",textvalue:"",x:0,y:0,fontcolorrange: ['黑', '粉红', '纯红', '紫罗兰', '蓝色', '绿宝石', '金', '深橙色','白色'],fontcolorhex: ['#000000', '#FF69B4', '#ff0000', '#9400D3', '#0000FF', '#00FA9A', '#FFD700', '#FF8C00', '#ffffff'],colorIndex:0,tempfile:"",canvasWidth:675,canvasHeight:0,imgwidth:0,imgheight:0,textIsClick:false,EmoPic: ['/img/Emoticon1.jpg', '/img/Emoticon2.jpg', '/img/Emoticon3.jpg','/img/Emoticon4.jpg'],EmoIndex:0,EmoButtonIsClick:false,EmoHeight:1,ishavePic:false}

我的思路是使用两个canvas分别用于绘制图片和文字,文字样式使用picker选择数据。
上方选择图片区域使用【cover-view】,做absolute定位。由于canvas作为原生组件会显示在最上层所以不能用【view】,遗憾的是cover-view不能实现css的transition动画及其他效果。【选择图片】按钮嵌套在cover-view内,点击时控制cover-view显示和隐藏(控制height)

<canvas canvas-id='canvas-pic' class='canvas-img' style='height:{{canvasHeight}}rpx'><canvas canvas-id='canvas-text' class='canvas-text' bindtouchstart='canvasmovestart' bindtouchmove='canvasmoveon' bindtouchend='canvasmoveout' disable-scroll='true'><cover-view class='chooseEmoPicView'><cover-view class='chooseEmoPic' style='height:{{EmoHeight}}px'><cover-image class='emoPic' src="{{EmoPic[0]}}" bindtap='bindEmoPicChoose' data-index='0' /><cover-image class='emoPic' src="{{EmoPic[1]}}" bindtap='bindEmoPicChoose' data-index='1' /><cover-image class='emoPic' src="{{EmoPic[2]}}" bindtap='bindEmoPicChoose' data-index='2' /><cover-image class='emoPic' src="{{EmoPic[3]}}" bindtap='bindEmoPicChoose' data-index='3' /></cover-view><button class='empPicButton' bindtap='bindEmoPicbutton'>选择图片</button></cover-view><button class='deleteImgBtn' bindtap='bindcanvasclear'></button><cover-image src='/img/icon/icon_04.png' class='deleteImg' bindtap='bindcanvasclear'></cover-image><cover-view class='deleteImgText' bindtap='bindcanvasclear'>清空画布</cover-view></canvas></canvas>

选择图片触发bindtap事件,函数bindEmoPicChoose:

bindEmoPicChoose:function(e){var that = thisvar index = e.currentTarget.dataset.indexvar EmoPic = that.data.EmoPicthat.setData({imgurl: EmoPic[index],ishavePic:true})that.canvasfunction()}

canvasfunction函数用于在canvas根据‘imgurl’绘制图片

canvasfunction:function(){var that = thisvar mycanvas = wx.createCanvasContext("canvas-pic")var imgwidth = that.data.imgwidthvar imgheight = that.data.imgheightvar imgurl = that.data.imgurlvar ishavePic = that.data.ishavePicif (ishavePic == true){mycanvas.drawImage(imgurl, 0, 0, imgwidth, imgheight)}else{mycanvas.setFillStyle("#000000")mycanvas.setFontSize("20")mycanvas.fillText("请选择一张图片吧~",app.globalData.screenWidth/2 - 100,(app.globalData.screenHeight)*0.3)}mycanvas.draw()console.log("发生了canvasfunction")console.log("ishavePic :" + ishavePic)},

(图片另外有函数做宽高自适应处理)
触发canvasfunction函数后,在需要绘制图片的canvas就根据imgurl绘制图片,该函数在onshow时也会执行,由于没有图片则示意用户选择图片。imgwidth与imgheight是另外函数获取图片的宽高,然后做自适应的数值。

点击图片后canvas绘制了图片,接下来选择文字样式

文字样式

在这里插入图片描述
文字内容、大小、颜色分别触发picker的bindchange事件相应函数,data中对应数据以数组的形式保存。bindchange的函数参照小程序官方开发文档。

【点我新增文字】按钮触发bindtap事件,事件函数如下:

canvasaddtext:function(){var that = thisvar mytext = wx.createCanvasContext("canvas-text")var text = that .data.textvaluevar color = that .data.fontcolorhex[that .data.colorIndex]mytext.setFillStyle(color)mytext.setFontSize(that.data.fontsize[that.data.sizeindex])mytext.fillText(text, 150, 150)mytext.draw()console.log("发生了canvasaddtext")that.setData({textsize: that.data.fontsize[that.data.sizeindex]})console.log("textsize:" + that.data.textsize)}

该函数使canvas-id为canvas-text的canvas绘制文字
在这里插入图片描述
文字允许拖拽以改变位置,我们需要对文字所在canvas的bindtouchstart事件、bindtouchmove事件设置对应函数

bindtouchstart事件:保存用户当前点击位置x、y坐标的值

canvasmovestart:function(e){var x = e.touches[0].xvar y = e.touches[0].ythis.setData({x:x,y:y,})console.log("x:" + e.touches[0].x)console.log("y:" + e.touches[0].y)}

bindtouchmove事件: 在手指移动后修改x、y坐标的值,并根据x、y值绘制canvas

canvasmoveon:function(e){console.log("moveon!")var x = e.touches[0].xvar y = e.touches[0].yvar textsize = this.data.textsizevar textlength = this.data.textlengthif(x<0){x = 0}if (x + (textlength * textsize) > 280) { x = 280 - (textlength * textsize)}if (y - (textsize) < 0){y = textsize}if(y + (textsize)>300){ y = 300 - textsize}console.log("x:" + x + "  y:" + y)var mytext = wx.createCanvasContext("canvas-text")var text = this.data.textvaluevar color = this.data.fontcolorhex[this.data.colorIndex]mytext.setFillStyle(color)mytext.setFontSize(this.data.fontsize[this.data.sizeindex])mytext.fillText(text, x, y)mytext.draw()this.setData({x: x,y: y,textvalue: text})}

这里textsize保存的是文本的px值,textlength 是文本框文字长度(e.detail.value.length可获得),文本px值与文本长度的积是文字总像素长度,用于判断距离canvas右边距的位置。由于这里需要限制文本可拖拽范围不能超过canvas图片区,当大于这个范围时,对应的x、y值将被固定。
拖动文字的效果,实际上就是每当坐标值更改时,对canvas重新绘制。
拖动文字时不允许屏幕滚动,因此在canvas标签内添加【disable-scroll=‘true’】

清除画布

在这里插入图片描述
清空画布按钮在右上角。由于在canvas上方,所以也需要嵌套在cover-view内,absolute定位,点击时触发bingtap事件,事件函数如下:

bindcanvasclear:function(){this.setData({ishavePic:false})this.canvasfunction()this.canvascleartext()},canvascleartext:function(){var mytext = wx.createCanvasContext("canvas-text")mytext.fillText("",0,0)mytext.draw()console.log("发生了canvascleartext")}

清除文本目前使用绘制空字符串的方法达到清除的效果

图片保存

图片保存需要调用wx.canvasToTempFilePath 和 wx.saveImageToPhotosAlbum接口,分别用于获取导出图片的url及图片保存到本地

wx.showToast({title: '图片生成中',duration:1000})
wx.canvasToTempFilePath({x: 0,y: 0,width: imgwidth,height: imgheight,canvasId: 'canvas-pic',success: function (res) {//var tempfile = res.tempFilePathconsole.log(res.tempFilePath)wx.hideToast()temp = res.tempFilePathwx.saveImageToPhotosAlbum({filePath: temp,success: function (data) {console.log('图片保存成功!data:' + data)},fail: function (err) {console.log("图片保存失败:error:" + err)}})}})

图片保存需要用户授权,在app.js中添加以下代码:

if (!res.authSetting['scope.writePhotosAlbum']){wx.authorize({scope: 'scope.writePhotosAlbum',success() {console.log('图片保存授权成功')}})}

这篇关于小程序实现canvas添加图文的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1035420

相关文章

PLsql Oracle 下载安装图文过程详解

《PLsqlOracle下载安装图文过程详解》PL/SQLDeveloper是一款用于开发Oracle数据库的集成开发环境,可以通过官网下载安装配置,并通过配置tnsnames.ora文件及环境变... 目录一、PL/SQL Developer 简介二、PL/SQL Developer 安装及配置详解1.下

VScode连接远程Linux服务器环境配置图文教程

《VScode连接远程Linux服务器环境配置图文教程》:本文主要介绍如何安装和配置VSCode,包括安装步骤、环境配置(如汉化包、远程SSH连接)、语言包安装(如C/C++插件)等,文中给出了详... 目录一、安装vscode二、环境配置1.中文汉化包2.安装remote-ssh,用于远程连接2.1安装2

vscode保存代码时自动eslint格式化图文教程

《vscode保存代码时自动eslint格式化图文教程》:本文主要介绍vscode保存代码时自动eslint格式化的相关资料,包括打开设置文件并复制特定内容,文中通过代码介绍的非常详细,需要的朋友... 目录1、点击设置2、选择远程--->点击右上角打开设置3、会弹出settings.json文件,将以下内

Window Server创建2台服务器的故障转移群集的图文教程

《WindowServer创建2台服务器的故障转移群集的图文教程》本文主要介绍了在WindowsServer系统上创建一个包含两台成员服务器的故障转移群集,文中通过图文示例介绍的非常详细,对大家的... 目录一、 准备条件二、在ServerB安装故障转移群集三、在ServerC安装故障转移群集,操作与Ser

windos server2022的配置故障转移服务的图文教程

《windosserver2022的配置故障转移服务的图文教程》本文主要介绍了windosserver2022的配置故障转移服务的图文教程,以确保服务和应用程序的连续性和可用性,文中通过图文介绍的非... 目录准备环境:步骤故障转移群集是 Windows Server 2022 中提供的一种功能,用于在多个

LinuxMint怎么安装? Linux Mint22下载安装图文教程

《LinuxMint怎么安装?LinuxMint22下载安装图文教程》LinuxMint22发布以后,有很多新功能,很多朋友想要下载并安装,该怎么操作呢?下面我们就来看看详细安装指南... linux Mint 是一款基于 Ubuntu 的流行发行版,凭借其现代、精致、易于使用的特性,深受小伙伴们所喜爱。对

手把手教你idea中创建一个javaweb(webapp)项目详细图文教程

《手把手教你idea中创建一个javaweb(webapp)项目详细图文教程》:本文主要介绍如何使用IntelliJIDEA创建一个Maven项目,并配置Tomcat服务器进行运行,过程包括创建... 1.启动idea2.创建项目模板点击项目-新建项目-选择maven,显示如下页面输入项目名称,选择

SigLIP——采用sigmoid损失的图文预训练方式

SigLIP——采用sigmoid损失的图文预训练方式 FesianXu 20240825 at Wechat Search Team 前言 CLIP中的infoNCE损失是一种对比性损失,在SigLIP这个工作中,作者提出采用非对比性的sigmoid损失,能够更高效地进行图文预训练,本文进行介绍。如有谬误请见谅并联系指出,本文遵守CC 4.0 BY-SA版权协议,转载请联系作者并注

CentOS 7 x64下安装MySql5.7图文详解

参考: https://dev.mysql.com/doc/mysql-yum-repo-quick-guide/en/ http://www.jianshu.com/p/7cccdaa2d177 http://www.linuxidc.com/Linux/2016-09/135288.htm 最近搞了台阿里云服务器,搭载的是CentOS 7系统,这里记录下mysql5.7的安装流程 查

Jenkins+Svn+Vue自动化构建部署前端项目(保姆级图文教程)

目录 介绍 准备工作 配置jenkins 构建部署任务 常见问题 介绍 在平常开发前端vue项目时,我们通常需要将vue项目进行打包构建,将打包好的dist目录下的静态文件上传到服务器上,但是这种繁琐的操作是比较浪费时间的,可以使用jenkins进行自动化构建部署前端vue 准备工作 准备vue项目,服务器,linux,ubuntu,centos等都可以,服务器上已经