> 问题描述:
小程序某个页面中点击按钮,想要生成带有二维码的图片,后续保存本地。生成图片后转发微信中,后长按图片不会出现识别图中二维码的选项问题。
一年前写过一个分享页,当时大部分可以识别,只有偶尔某一次识别不出来,当时就没有解决,可产品还能过去。可最近写了一个新的页面也有二维码,生成图片逻辑是一套代码,可这次没有有一次成功的。你说这咋整,想偷懒还是过不去的,终究还是要为自己的懒惰付出,躲不过去的,如果不打算转行,还是别给自己留坑吧。填起来~~~~~~
对于生成海报的功能搜一搜遍地都是,在这里我就不展开说了,本篇就对二维码的绘制详细介绍下!
>问题处理重点:
第一种使用,上代码:
const QRCode = require('../utils/QRCode.js')
ctx.draw(true, () => {
// 画二维码
let qrCode = new QRCode("shareImg", { // shareImg是canvas标签中的canvas-id="shareImg"
width: 100 * fixWidth, // 二维码宽高,以及距离画布的顶部左边的定位距离
height: 100 * fixWidth,
left: 520 * fixWidth,
top: 1132 * fixWidth,
typeNumber: 2
})
qrCode.makeCode(qrStr, () => { // qrStr是二维码地址如:https://www.baidu.com
// 二维码画成功
setTimeout(() => {
// 生成图片
createImage(that) // 继续执行生成图片操作wx.canvasToTempFilePath()
}, 300)
})
})
完工!这也就是我一年前的使用方式,本来也是好好地。可这次怎么都不行了。百度后知道了,因为第一次的时候,页面地址比较短,而且UI二维码图片比较大。但是这一次,很长的链接,二维码大小又变小了。奈何生成的二维码特别密集,手机根本识别不出来,无奈前功尽弃了,只能换其他的技术方案。 这也就是为什么我同一个方法效果不同的原因了。这种方式的清晰度和图片的URL及UI大小都有关系。所以如果和我遇到相同问题的同学,如果想快速解决上线,就可以把二维码UI调大,地址变短;这就几分钟就可以提交审核,后面我们在去研究其他方法(方法二)。但是目前这个大小和清晰度的关系我不是很清楚,有同学知道的可以告知一下,非常感谢!
接下来我们来研究第二种比较稳的方式,形成base64文件。
这种方式确实相对于第一种方式来说太棒了,即使二维码UI很小也能识别出来呢。
------原理:利用qrcode-base64 将二维码的URL链接,转成base64;因为小程序不能直接显示base64,所以接下来我们就利用创建读写流wx.getFileSystemManager()把base64通过writeFile写入本地,获得到一个临时文件地址;然后drawImage绘制出来就可以了。
下面我们就来看下他的代码实现:
const QR = require('../utils/weapp-qrcode.js')
var base64Data = QR.drawImg(qrStr, { // 二维码地址URL
typeNumber: 4,
errorCorrectLevel: 'M',
size: 500
})
// console.log(base64Data); // base64地址
/* 创建读写流 */
const fs = wx.getFileSystemManager()
const times = new Date().getTime()
const codeimg = wx.env.USER_DATA_PATH + '/' + times + '.png'
/* 将base64图片写入 */
fs.writeFile({
filePath: codeimg,
data: base64Data.slice(22), /* 数据流 */
encoding: 'base64',
success: () => {
ctx.drawImage(codeimg,520 * fixWidth, 1132 * fixWidth,50 * fixWidth, 50 * fixWidth)
console.log(codeimg);
ctx.draw(true, () => {
setTimeout(() => {
// 生成图片
createImage(that)
}, 300)
})
},
fail(res) {
console.error(res)
}
})
好了。到目前为止,可以把二维码大小改小,二维码也可以识别无误了。本以为万事大吉了。结果看网友说writeFile写入是有一定的空间大小的,如果一直写入到达一定空间后会写入不进去,就会报错。所以需要实时清理。那好吧,为了以防万一我们就在保存图片成功后,调用下清除函数removeSave() 去清空下内存。
下面是清缓函数代码:(原理:首先用FileSystemManager.readdir来拿到文件列表,再通过FileSystemManager.unlink把文件删掉)
// 把写入的文件删除,防止超过最大范围而无法写入,报错
const removeSave = () =>{
return new Promise((resolve)=>{
const fsm = wx.getFileSystemManager(); //文件管理器
fsm.readdir({ // 获取文件列表
dirPath: wx.env.USER_DATA_PATH,// 当时写入的文件夹
success(res){
console.log(res);
res.files.forEach((el) => { // 遍历文件列表里的数据 (把不是.png后缀的过滤掉)
if(el.includes('.png')){
// 删除存储的垃圾数据
fsm.unlink({
filePath: `${wx.env.USER_DATA_PATH}/${el}`, // 这里注意。文件夹也要加上,如果直接文件名的话会无法找到这个文件
fail(e){
console.log('readdir文件删除失败:',e)
}
});
}
})
resolve()
}
})
})
}
到目前为止全部说完! 有问题 欢迎大家评论交流点赞哦~~~~~ 一起踩坑
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A
我是Rails的新手,所以请原谅简单的问题。我正在为一家公司创建一个网站。那家公司想在网站上展示它的客户。我想让客户自己管理这个。我正在为“客户”生成一个表格,我想要的三列是:公司名称、公司描述和Logo。对于名称,我使用的是name:string但不确定如何在脚本/生成脚手架终端命令中最好地创建描述列(因为我打算将其设置为文本区域)和图片。我怀疑描述(我想成为一个文本区域)应该仍然是描述:字符串,然后以实际形式进行调整。不确定如何处理图片字段。那么……说来话长:我在脚手架命令中输入什么来生成描述和图片列? 最佳答案 对于“文本”数
我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些
有这些railscast。http://railscasts.com/episodes/218-making-generators-in-rails-3有了这个,你就会知道如何创建样式表和脚手架生成器。http://railscasts.com/episodes/216-generators-in-rails-3通过这个,您可以了解如何添加一些文件来修改脚手架View。我想把两者结合起来。我想创建一个生成器,它也可以创建脚手架View。有点像RyanBates漂亮的生成器或web_app_themegem(https://github.com/pilu/web-app-theme)。我
导读语言模型给我们的生产生活带来了极大便利,但同时不少人也利用他们从事作弊工作。如何规避这些难辨真伪的文字所产生的负面影响也成为一大难题。在3月9日智源Live第33期活动「DetectGPT:判断文本是否为机器生成的工具」中,主讲人Eric为我们讲解了DetectGPT工作背后的思路——一种基于概率曲率检测的用于检测模型生成文本的工具,它可以帮助我们更好地分辨文章的来源和可信度,对保护信息真实、防止欺诈等方面具有重要意义。本次报告主要围绕其功能,实现和效果等展开。(文末点击“阅读原文”,查看活动回放。)Ericmitchell斯坦福大学计算机系四年级博士生,由ChelseaFinn和Chri
前言一般来说,前端根据后台返回code码展示对应内容只需要在前台判断code值展示对应的内容即可,但要是匹配的code码比较多或者多个页面用到时,为了便于后期维护,后台就会使用字典表让前端匹配,下面我将在微信小程序中通过wxs的方法实现这个操作。为什么要使用wxs?{{method(a,b)}}可以看到,上述代码是一个调用方法传值的操作,在vue中很常见,多用于数据之间的转换,但由于微信小程序诸多限制的原因,你并不能优雅的这样操作,可能有人会说,为什么不用if判断实现呢?但是if判断的局限性在于如果存在数据量过大时,大量重复性操作和if判断会让你的代码显得异常冗余。wxswxs相当于是一个独立
项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU