小程序drawimage,小程序drawimage不显示

http://www.itjxue.com  2023-01-22 03:42  来源:未知  点击次数: 

小程序 使用upng.js 把小程序选择的图片转换为base64

有时候会遇到后端需要前端获取的图片文件转换成base64,在传给后台

小程序有专门的选择图片接口,

wx.chooseImage(OBJECT)

但是这个只是返回一个图片的临时路径,并不是文件数据本身。

小程序暂时没有接口直接转base64的

所以我们需要使用canvas和canvasGetImageData(小程序版本1.9.0以后要才有)先获取图片内容,

再通过插件upng.js插件实现图片转base64(所需插件文件附件中)

1. 把upng.js和pako.min.js文件放到项目中

2. 在pages下的页面js文件中导入

var upng = require('../../utils/upng.js');

这里只需要导入npng.js ,pako.min.js是在npng,js里面调用

3. 建一个canvas

chooseImage"人脸测试 ?

// 画布

// 生成base64位图片展示 变量imgbase64

need-to-insert-img

4. 添加js点击chooseImage事件

chooseImage: function() {

? ? ? ? var that = this;

? ? ? ? var coss_signature = wx.getStorageSync('cos_signature');

? ? ? ? var canvasID = "imgCanvas";

? ? ? ? var canvas = wx.createCanvasContext(canvasID)

? ? ? ? wx.chooseImage({

? ? ? ? ? ? sourceType: ['album', 'camera'],

? ? ? ? ? ? sizeType: ['original'],

? ? ? ? ? ? count: 1,

? ? ? ? ? ? success: function (res) {

? ? ? ? ? ? ? ? var tempFilePaths = res.tempFilePaths;

? ? ? ? ? ? ? ? // 获取文件路径

? ? ? ? ? ? ? ? var filePath = tempFilePaths[0];

? ? ? ? ? ? ? ? // 1. 绘制图片至canvas

? ? ? ? ? ? ? ? canvas.drawImage(filePath, 0, 0, 300, 200)

? ? ? ? ? ? ? ? // 绘制完成后执行回调,API 1.7.0

? ? ? ? ? ? ? ? canvas.draw(false, function(res){

? ? ? ? ? ? ? ? ? ? // 2. 获取图像数据, API 1.9.0

? ? ? ? ? ? ? ? ? ? wx.canvasGetImageData({

? ? ? ? ? ? ? ? ? ? ? ? canvasId: canvasID,

? ? ? ? ? ? ? ? ? ? ? ? x: 0,

? ? ? ? ? ? ? ? ? ? ? ? y: 0,

? ? ? ? ? ? ? ? ? ? ? ? width: 300,

? ? ? ? ? ? ? ? ? ? ? ? height: 200,

? ? ? ? ? ? ? ? ? ? ? ? success(res) {

? ? ? ? ? ? ? ? ? ? ? ? ? // 3. png编码

? ? ? ? ? ? ? ? ? ? ? ? ? let pngData = upng.encode([res.data.buffer], res.width, res.height)

? ? ? ? ? ? ? ? ? ? ? ? ? // 4. base64编码

? ? ? ? ? ? ? ? ? ? ? ? ? let base64 = wx.arrayBufferToBase64(pngData)

? ? ? ? ? ? ? ? ? ? ? ? ? // ...

? ? ? ? ? ? ? ? ? ? ? ? ? that.setData({

? ? ? ? ? ? ? ? ? ? ? ? ? ? imgbase64: base64

? ? ? ? ? ? ? ? ? ? ? ? ? })

? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? })

? ? ? ? ? ? ? ? })

? ? ? ? ? ? }

? ? ? ? })

? ? }

5. 实现

need-to-insert-img

need-to-insert-img

tips

画布画的图片的长和宽是固定的,这个按照自己需求设置。

可以通过小程序的

wx.getImageInfo(OBJECT)

获取长和宽

相关链接

upng.js:?

wx-cardscanner:? 有时候会遇到后端需要前端获取的图片文件转换成base64,在传给后台

小程序有专门的选择图片接口,

但是这个只是返回一个图片的临时路径,并不是文件数据本身。

小程序暂时没有接口直接转base64的

所以我们需要使用canvas和canvasGetImageData(小程序版本1.9.0以后要才有)先获取图片内容,

再通过插件upng.js插件实现图片转base64(所需插件文件附件中)

1. 把upng.js和pako.min.js文件放到项目中

2. 在pages下的页面js文件中导入

var upng = require('../../utils/upng.js');

这里只需要导入npng.js ,pako.min.js是在npng,js里面调用

3. 建一个canvas

chooseImage"人脸测试 ?

// 画布

// 生成base64位图片展示 变量imgbase64

4. 添加js点击chooseImage事件

chooseImage: function() {

? ? ? ? var that = this;

? ? ? ? var coss_signature = wx.getStorageSync('cos_signature');

? ? ? ? var canvasID = "imgCanvas";

? ? ? ? var canvas = wx.createCanvasContext(canvasID)

? ? ? ? wx.chooseImage({

? ? ? ? ? ? sourceType: ['album', 'camera'],

? ? ? ? ? ? sizeType: ['original'],

? ? ? ? ? ? count: 1,

? ? ? ? ? ? success: function (res) {

? ? ? ? ? ? ? ? var tempFilePaths = res.tempFilePaths;

? ? ? ? ? ? ? ? // 获取文件路径

? ? ? ? ? ? ? ? var filePath = tempFilePaths[0];

? ? ? ? ? ? ? ? // 1. 绘制图片至canvas

? ? ? ? ? ? ? ? canvas.drawImage(filePath, 0, 0, 300, 200)

? ? ? ? ? ? ? ? // 绘制完成后执行回调,API 1.7.0

? ? ? ? ? ? ? ? canvas.draw(false, function(res){

? ? ? ? ? ? ? ? ? ? // 2. 获取图像数据, API 1.9.0

? ? ? ? ? ? ? ? ? ? wx.canvasGetImageData({

? ? ? ? ? ? ? ? ? ? ? ? canvasId: canvasID,

? ? ? ? ? ? ? ? ? ? ? ? x: 0,

? ? ? ? ? ? ? ? ? ? ? ? y: 0,

? ? ? ? ? ? ? ? ? ? ? ? width: 300,

? ? ? ? ? ? ? ? ? ? ? ? height: 200,

? ? ? ? ? ? ? ? ? ? ? ? success(res) {

? ? ? ? ? ? ? ? ? ? ? ? ? // 3. png编码

? ? ? ? ? ? ? ? ? ? ? ? ? let pngData = upng.encode([res.data.buffer], res.width, res.height)

? ? ? ? ? ? ? ? ? ? ? ? ? // 4. base64编码

? ? ? ? ? ? ? ? ? ? ? ? ? let base64 = wx.arrayBufferToBase64(pngData)

? ? ? ? ? ? ? ? ? ? ? ? ? // ...

? ? ? ? ? ? ? ? ? ? ? ? ? that.setData({

? ? ? ? ? ? ? ? ? ? ? ? ? ? imgbase64: base64

? ? ? ? ? ? ? ? ? ? ? ? ? })

? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? })

? ? ? ? ? ? ? ? })

? ? ? ? ? ? }

? ? ? ? })

? ? }

5. 实现

tips

画布画的图片的长和宽是固定的,这个按照自己需求设置。

可以通过小程序的

获取长和宽

相关链接

upng.js:?

wx-cardscanner:?

支付宝&微信小程序Canvas生成图片

canvas转换图片api不相同,并且参数不相同,支付宝参数与支付宝开发者文档中的参数都出现不相同

下面我们看微信的wx.canvasToTempFilePath和支付宝ctx.toTempFilePath中success返回的参数差异,我们如果要获取对应的图片,wx返回两种图片格式,一种是本地图片,一种是http协议内部临时图片(tempFilePath)。而支付宝只存在一种图片格式,http协议临时图片(apFilePath)。

微信端中如果需要绘画canvas生成的图片进已有的canvas,采用drawImage,其中第一个参数是图片地址,微信端中要采用tempFilePath参数,支付宝端需要采用apFilePath

小程序Canvas闪屏处理

最近在微信小程序开发中需要用到canvas绘制中国象棋的的棋盘棋子,该需求用来复盘对弈记录,由于复盘的每一步都是用fen串 (参考:FEN文件格式) 来转换出所有棋子的位置,所以每一步都会将棋子重新绘制一遍,为了避免显示上一次步绘制i的内容需要先清空canvas再绘制新的棋子,清空和重新绘制的过程就会出现闪屏的现象,所以每次点上一步下一步的时候都会闪一下,体验很不好。

为了解决这个问题,搜索了一些解决方案,最终决定参考双缓存 《在Canvas clearRect中引起的闪屏怎么解决?双缓存解决闪屏问题详解!》 的方式解决这个问题。

由于棋子元素过多,每一颗棋子都要调用一次drawImage,且新版的canvas是异步进行的,如果不采用缓存的方式,看起来不仅有闪烁的现象还会有一种棋子一个一个出现的感觉。现将内容绘制好生成图片,在另一个canvas中只需要绘制这一张图片并覆盖之前的内容,而不需要清空,这样就避免了闪屏的问题。

效果对比:

如果有更好的方案,请不吝赐教。

微信小程序中canvas.drawImage画图

描述:在页面加载是使用canvas.drawImage画图,点击页面下面按钮在已绘制好的图形上继续画图。使用ctx.draw()弄了多次,均会把之前的图清掉重新绘制,看文档得知,在ctx.draw()时,传入参数true即可保存原来绘制的图,在此记录一下。

详见如下:

canvas使用:

index.wxml中

js中

微信什么小程序可以改手机截图

微信截屏,微信小程序截屏调用教程

一、程序简介:

本程序主要是用户1通过在相机上涂鸦来描绘物体的轮廓。然后,用户2根据轮廓寻找物体。如果成功则返回正确,否则返回继续努力。(具体开发流程和功能见微信小程序应用开发计划表。)

二、开发平台

微信开发者工具V1.02.1803210

三、进展

目前小程序的截图功能已经实现。后台识别也已经实现,同时正在完善数据库。

四、思路

想法一:

通过定位API获取用户位置,加上重力加速度或者罗盘来模拟实现。但想法一在实现的时候遇到如下问题被舍弃:

1)获取位置时使用误差不确定。(获取五次位置的平均值误差依然无法确定)

2)如果物体进行移动或同类物体无法识别。

想法二:

通过截取前后两个场景中包围轨迹的最大矩形,传输到后端进行识别。最后由后台返回结果

截屏实现大致过程:记录下用户的最大最小X、Y坐标-调用相机组件的takePhoto控件—调用画布组件drawImage绘制图像到画布-根据最大最小X、Y坐标调用画布的canvasToTempFilePath导出图像。

遇到问题以及解决方案:

1. 在调用小程序的位置API时,发现获取5次平均值是0

原因:小程序的API有些是多线程的,因此在API后面的语句不一定后执行。

2. 画板无法覆盖到相机组件上:

原因:相机组件是源生组件,在上面只能覆盖cover-view和cover-image组件。

解决方法:画板也为源生组件,虽然按理来说可以覆盖。但是在页面首次加载中,相机会在画板的上面。第二次加载时,画布才可以覆盖到相机组建上面。因此,在开始界面调用一次相机,在第二界面就可以在上面覆盖画布了。

3. 在画布上调用drawImage绘制照片的部分图像时有问题。

原因:没找到

解决方案:将整张图绘制到画布中进行部分截取,这个在IOS系统中是可以的。在Android系统有问题。

4. 画布中导出图像中没有darwImage在画布上绘制的图。

原因:drawImage绘图需要时间。

解决方案:设置一个两秒的定时器。

5. 截图功能在安卓上可以运行,在IOS上无法点击

原因:微信在两个平台上采用的是不同的运行环境。在安卓上cover控件在画板上面,IOS中cover控件在画板下面。

解决方案:在相机控件的下方添加控件,同时调用drawImage时画板坐标乘上一个比例。(其画板坐标单位是像素)

6. 在API内用this指针发现无法给Page中数据赋值

原因:在部分API中,this指针可能不指向页面实例。

解决方法:先用that把this指针的值保存起来,在API内部用that。

7. 在函数中给page中的字符串和对象赋值时跳出函数范围,其值变为空

原因:这应该和程序执行的内存机制有关

解决方法:在给变量申请一个空间,如 str:new string()。之后赋值时问题便会解决。

8. 画板的drawImage绘制图形问题

原因:经过测试drawImage中的单位确实是像素。不过手机的像素为360*560,照片的像素却为720*1136。

解决方案:无

9. 程序的涂鸦和识别分为两个窗口后。识别窗口会显示轨迹,但背景却是黑色。

原因:不明

解决方案:在识别窗口第一次调用drawImage时,现调用一下clearfill()清空画布。

10. 记录轨迹

原因:前期我们是用点来描述用户的轨迹的,具体见边框绘制。但这样绘制出的点我们感觉贴的图不美观,之后想要改为用户自己绘制的轨迹

解决方案:在用户点击完成后先把用户的轨迹导入成一张透明图片,传入识别界面。然后贴在画板上。

微信小程序网络图片不显示怎么解决?

这样的情况,可以把微信的重要东西备份,然后清除数据,或是卸载掉该软件重新安装适合系统版本的该软件版本,这样应该可以恢复正常显示的

(责任编辑:IT教学网)

更多

推荐网页制作视频教程文章