这篇文章给大家介绍的内容是关于canvas实现九宫格心形拼图的方法(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

说明

前几天在朋友圈看到好几次这种图片。

用其中的小格子,来拼出心形,根据数组的内容在 canvas 上进行渲染。

小程序的功能

这个小程序有 选择单张图片,选择多张图片,补充图片,保存图片,重置,推荐,意见反馈,这几个功能。

选择单张图片

当用户点击心形区域的时候,就可以选择单张图片,调用 wx.chooseImage 就可以从本地相册选择图片,然后就把这张图,画在 canvas上,具体画的位置就是用户点击的位置。

在小的 canvas上绑定 touchend 事件,触发事件后,事件中有一个 changedTouches 属性,这是一个保存了,当前变化的触摸点信息的数组,这个数组中的元素有 x 和 y 属性,也就是触摸点距离 canvas 左上角的距离。// 触摸点在 x 轴的值

var x = e.changedTouches[0].x;

// 触摸点在 y 轴的值

var y = e.changedTouches[0].y;

有 x 轴 和 y 轴的距离后,算出具体应该画在哪个格子上。//grid 表示一个格子的宽度

// 确定 x 轴是在第几个格子

x = Math.floor(x / grid);

// 确定 y 轴是在第几个格子

y = Math.floor(y / grid);

知道在哪个格子画之后,就要确定画图片的哪部分了,因为所有的格子都是正方形的,但是用户选择的图片不一定是正方形,如果压缩成正方形会很难看,所以我画的时候,选择了正中间的部分来画,

通过 wx.getImageInfo 来获取图片信息,以短边为正方形的宽,然后从(长边 - 短边)/2 的地方来画。// 获取图片的宽和高

var width = res.width;

var height = res.height;

// 如果图片不是正方形,只画中间的部分

// sWidth 表示正方形的宽

var sWidth = width > height ? height : width;

// sx 是源图像的矩形选择框的左上角 X 坐标

var sx = 0;

// sy 是源图像的矩形选择框的左上角 y 坐标

var sy = 0;

if (width > height) {

sx = (width - height) / 2;

}

if (width < height) {

sy = (height - width) / 2;

}

知道画什么,在哪里画之后,调用 canvasContext.drawImage 来画就可以了。

选择多张图片

选择多张图片,同样是调用 wx.chooseImage 方法,成功选择多张图片后,返回的对象中有一个 tempFilePaths 属性,这个属性保存了,图片的本地文件路径列表。

然后遍历 heart 数组,也就是保存心形数据的数组,如果数组中某个元素的值是1,也就是说在心形范围内,就按顺序从 tempFilePaths 中取一张图片画上去,画的时候同样的,如果不是正方形就只画中间的部分。

补充图片

在 image 的文件中,有保存几张图片,用来补充心形,他们的路径保存在一个数组中。// 用来补充心形的图片

images: [

'../../images/1.jpg',

'../../images/2.jpg',

'../../images/3.jpg',

'../../images/4.jpg',

'../../images/5.jpg',

'../../images/6.jpg',

'../../images/7.jpg',

'../../images/8.jpg',

'../../images/9.jpg',

'../../images/10.jpg',

]

然后就是遍历 heart 数组,如果数组的某个元素的值是1,就随机从这组图片中选择一张画上去。

画一张图片,画多张图片,补充图片,他们都是在 canvas 上画图片,为了避免已经画了图片的位置被覆盖,他们所画的图片的等级是不同的。补充图片:1

画多张图片:2

画一张图片:3

等级高的可以覆盖等级低的,等级低的不能覆盖等级高的,同等级的,除了画多张图片的不能覆盖,其余的两种情况,都可以覆盖。

简单意思就是:

补充图片,补充完了之后,再补充会把原来补充的覆盖掉,但是用户选择的图片不会被覆盖掉。

画多张图片,可以覆盖掉补充的图片,但用户选择的图片也不会覆盖掉。

画一张图片,不管这个位置有没有图片,都会再画一张。

保存图片

保存图片的时候,就是按顺序对大的 canvas 进行截取,然后保存成图片,主要靠 wx.canvasToTempFilePath 这个API来实现,这个 API ,可以把当前画布指定区域的内容导出生成指定大小的图片,并返回文件路径。

这里要注意几个细节

1、为了避免最后保存的图片有黑色背景,最好开始的时候就在 canvas 上画一个 和 canvas 大小一样的矩形,矩形填充上颜色。

2、为了保存的图片,在用户的相册中也能保持心形。需要按下面这个顺序来保存图片

用API wx.getSystemInfo 可以查看设备像素比wx.getSystemInfo({

success: function(res) {

console.log(res.pixelRatio)

}

})

这里如果我的理解有误,还请知道的小伙伴指出。

说了这么多,主要就是想说用默认的值其实就已经很清晰了。

4、因为要保存9张图片,所以需要一些时间,这个时候就需要一个进度条了,保存图片的时候,显示进度条,禁用保存按钮,毕竟点击一下按钮就是9张图片,所以这个时候还是禁用了好,每保存一张图片进度条的值就 +12 ,超过100的时候,就表示 9张图片都保存好了。

而微信小程序中也刚好有进度条(progress)这个组件。

重置

这个功能就是遍历 heart 数组,用一种颜色,根据数组内容,把心形画出来。然后再在 x 轴 和 y 轴上画两条线,行成九宫格的样子。

推荐 和 意见反馈推荐给朋友

意见反馈

这个两个功能就是用了,微信小程序的 button 组件,这里需要注意的就是,在清除 button 的默认样式时,需要把 button 的 after 伪元素的边框也去掉。button::after{

border: 0;

}

可以优化的地方

有一些地方是小程序在替用户做选择,比如,如果所选择的图片不是正方形,就画中间的部分,但是中间的部分不一定是用户想要的,而如果每张图片都要用户自己来选择画哪部分,一共81张图片,显然是有些麻烦了,这里还可以继续优化下。

还有在补充图片的时候,补充的图片也不一定是用户喜欢的,所以这部分再考虑是不是可以加一些标签,用户选择不同的标签,来补充符合标签的图片,类似 QQ音乐的歌词海报这样。

HTML5 Canvas实现交互式地铁线路图

使用h5 canvas实现时钟的动态效果

Php字符拼出心形,canvas实现九宫格心形拼图的方法(附代码)-相关推荐

  1. Php字符拼出心形,怎么用文字拼成心形?名字心形图案怎么做?文字拼成一个爱心怎么制作?告白图片制作...

    昨天说明天就是七夕节了,那么今天呢~就是七夕啦,不过小编家乡那边不把七夕当情人节过的,反而是虚岁十五岁少年的成人礼,可隆重了呢~但是此刻不在老家的小编还是不能免俗的要把今天当成情人节啊,虽然是只单身汪 ...

  2. 小程序—九宫格心形拼图 1

    说明 前几天在朋友圈看到好几次这种图片. 这种图片,是用九张图片拼成的一个心形. 感觉很有趣,就上网查了查怎么做,大部分的说法就是用美图秀秀的拼图功能来做, 在微信小程序中也有专门做心形拼图的小程序, ...

  3. 九宫格心形拼图—python3

    九宫格心形拼图-python3 第一次写这玩意,纯粹是为了记下我改写的代码,同时方便和其他像我一样的小白学习交流. 这个代码是改编自别人的九宫格代码,就是把九张图片拼起来,我想着给升级下,就给拼成了心 ...

  4. 【微信小程序canvas】实现小程序手写板用户签名(附代码)

    [微信小程序canvas]实现小程序手写板用户签名(附代码) 工作中公司业务需要的微信小程序用户签字功能 先看效果图: wxml <view class="wrapper"& ...

  5. 九宫格心形拼图小程序源码/带流量主微信小程序源码

    九宫格心形拼图小程序源码/带流量主微信小程序源码 ☑️ 编号:ym476 ☑️ 品牌:无 ☑️ 语言:微信小程序 ☑️ 大小:500KB ☑️ 类型:九宫格心形拼图 ☑️ 支持:微信小程序

  6. 最新九宫格心形拼图微信小程序源码+带流量主

    正文: 九宫格心形拼图小程序源码,带流量主微信小程序源码.可以自定义拼图形状,保存张数 自由填充图片.自由剪裁图片等.并带有流量主广告位,有需要的可以下载看看. 程序: wwuyj.lanzoui.c ...

  7. php绘制一个三角形,如何利用css或html5画出一个三角形?两种不同的制作三角形方法(代码实例)...

    我们在平时的前端开发的时候,有时候是需要一些小图形来丰富一下页面效果,比如:下拉列表的倒三角图形.那么这样的一个三角形是如何制作出来的,本章给大家介绍如何利用css或html画出一个三角形?两种不同的 ...

  8. h5画三角形_如何利用css或html5画出一个三角形?两种不同的制作三角形方法(代码实例)...

    我们在平时的前端开发的时候,有时候是需要一些小图形来丰富一下页面效果,比如:下拉列表的倒三角图形.那么这样的一个三角形是如何制作出来的,本章给大家介绍如何利用css或html画出一个三角形?两种不同的 ...

  9. 【微信小程序canvas】实现小程序手写板用户签名(附代码)测试有效

    工作中公司业务需要的微信小程序用户签字功能 先看效果图: wxml: <view class="wrapper"><view class="handBt ...

最新文章

  1. 如何动态修改windows下的host文件
  2. 20155238 实验四 Android程序设计
  3. Managing Gigabytes--文本压缩
  4. File System Auditor 安装全程截图
  5. 第三十三期:对于人工智能的恐惧及其5个解决方法
  6. java面试请你谈谈mysql_Java面试题之MySQL
  7. 谷歌在线办公法器-Google Docs
  8. spring boot 配置 druid的filters时报错 Reason: org.apache.log4j.Priority
  9. 【C语言】谭浩强C语言程序设计第五版135页例5.11译密码题的新解
  10. ERP常用词汇中英文对照
  11. centos安装stress安装失败_Linux压力测试软件Stress使用指南
  12. Java double 保留一个小数、理解BigDecimal、Java解决精度问题
  13. matlab析取范式求主析取范式用电脑,(p∧q)∨r 求其主析取范式 再用主析取范式求主合取范式...
  14. 高并发如何处理,解决方案
  15. 网络工程师高薪就业行业有哪些
  16. 锐捷设备设置console和enable密码
  17. C语言标准输入输出缓冲区
  18. org.apache.catalina.LifecycleException: Failed to start component [Connector[HTTP/1.1-8082]]解决办法
  19. 乘风而起,驭势而行 | 驭势科技2021届校园招聘启动
  20. c#中应用skinEngine给应用程序换皮肤

热门文章

  1. vulnhub之 BLUEMOON: 2021
  2. LeetCode-题目详解(十一):回溯算法【递归回溯、迭代回溯】【DFS是一个劲往某一个方向搜索;回溯算法建立在DFS基础之上,在搜索过程中,达到结束/裁剪条件后,恢复状态,回溯上一层,再次搜索】
  3. 实例分割研究综述总结
  4. 用mysql编资产负债表_资产负债表如何编制!
  5. 高电压技术重点知识整理
  6. 固生堂通过港交所聆讯:上半年营收约6亿元,已实现连续盈利
  7. Linux中netstat -anp命令
  8. 图解:如何理解与实现散列表
  9. DDD学习(一)——通用语言
  10. 摘抄各类语言设计模式(仅做笔记)