【自用笔记】小程序 图片url和base64互转,延伸canvas压缩

教你在canvas上绘制Base64格式的图片 现象描述 当前canvas组件只支持绘制本地图片和网络图片,暂不支持绘制Base64字符串表示的图片格式,下面介绍如何采取规避措施实现。 问题分析 当前image组件支持Base64字符串表示的图片格式,如下所示: 因此可以考虑通过image组件来表示Base64字符串表示的图片,然后用canvas组件绘制image元素来间接实现绘制Base64字符串表示的图片格式。 解决方法 代码如下: 复制 1 2 3 4 5 6 7 阅读详情

领导让图片上传前做校验并进行压缩,给了一个vue的案例,是需要传入base64的,但是小程序是获取到图片地址。虽然最后用了别的方法进行图片压缩,但是既然搜到了转base64,那就记录一下,防止自己忘记。

比如我是在van-uploader的 before-read 中进行的,

以下是图片url转base64的方式:

.wxml中:

<van-uploader file-list="{{ imgList }}" max-count="5" upload-icon="scan" bind:after-read="afterRead" bind:delete="imgDelete" use-before-read="{{ true }}" bind:before-read="beforeRead" />


.js中:

beforeRead(event) {
    const { file, callback } = event.detail;
    this.getImageBase64_readFile(file.tempFilePath).then((res) => {
        callback(res); //res 为 base64流
    })
  },

//图片转base64
async getImageBase64_readFile(tempFilePath) {
    return  await new Promise(resolve => {
      //获取全局唯一的文件管理器 
      wx.getFileSystemManager().readFile({ //读取本地文件内容
        filePath: tempFilePath, // 文件路径
        encoding: 'base64', // 返回格式
        success: ({
          data
        }) => {
            // 这里必须要用'data:image/png;base64,'前缀,
            resolve('data:image/png;base64,' + data);
        }
      });
    });
  },

该代码块是base64转图片url↓:

// base64: 图片的base64文件流,最后用callback返出去

base64ImgtoFile(base64, callback) {
        const fsm = wx.getFileSystemManager();
        const FILE_BASE_NAME = new Date().getTime(); //自定义文件名(这里以时间戳为文件名)
        const [, format, bodyData] = /data:image\/(\w+);base64,(.*)/.exec(base64) || [];
        if (!format) {
            return (new Error('ERROR_BASE64SRC_PARSE'));
        }
        const imageUrl= `${wx.env.USER_DATA_PATH}/${FILE_BASE_NAME}.png`;
        const buffer = wx.base64ToArrayBuffer(bodyData);
        fsm.writeFile({
        imageUrl,
        data: buffer,
        encoding: 'binary',
        success() {
          callback(imageUrl); //返出图片url
        },
        fail() {
          return (new Error('ERROR_BASE64SRC_WRITE'));
        },
      });
    }

使用时:

base64ImgtoFile(base64, resCurrent => {
     let imageUrl = resCurrent   // resCurrent 是返回的图片地址

    // 这里可以进行自己的业务逻辑

})

在这里延伸一个小程序的图片压缩方法(因为我的业务用到的地方比较多,所以提出来放在了utils里面,随时使用):

// 压缩图片
const compressImg = (imageUrl) => {
    let _this = this;
        return new Promise((resolve, reject) => {
        //获取原图片信息 canvas压缩实现
        wx.getImageInfo({
        src: imageUrl,
        success: function (res) {
        // let canvasRatio = 1.1;
        var quality = 0.8;   //压缩系数0-1之间,越小越模糊(这里是用来压缩图片体积达到压缩效果的,和下面的修改图片大小为两种类型)
        let picWidth = res.width/2 //图片原始长宽
        let picHeight = res.height/2
        // while (picWidth > 600 || picHeight > 600) { // 保证宽高在600以内(通过宽高修改来修改图片大小,如果你要通过改变图片大小来控制图片体积的话,就可以放开这里的代码)
        //     picWidth = Math.trunc(res.width / canvasRatio)
        //     picHeight = Math.trunc(res.height / canvasRatio)
        //     canvasRatio = canvasRatio + 0.1;
        // }
        const query = wx.createSelectorQuery()
        query.select('#picCanvas').fields({
            node: true,
            size: true
        }).exec((res) => {
            try {
            const canvas = res[0].node
            const ctx = canvas.getContext('2d')
            // let dpr = wx.getSystemInfoSync().pixelRatio
            //这里是设置css样式的宽高。
            //属性宽高是css样式宽高的dpr倍,兼容不同机型,避免绘制的内容模糊。
            // _this.setData({
            //     canvasWidth: picWidth / dpr,
            //     canvasHeight: picHeight / dpr
            // })
            canvas.width = picWidth
            canvas.height = picHeight

            const img = canvas.createImage()
            img.src = imageUrl
            img.onload = () => {
                ctx.drawImage(img, 0, 0, picWidth, picHeight); //先画出图片
                var base64 = canvas.toDataURL("image/jpeg",quality ); //压缩语句(压缩体积,不改变宽高大小,quality可以动态改变,这里压缩后返回的是图片base64)
                
                 //这里可以用base64转图片url的方法,转化成图片url然后给resolve出去,也可以直接在resolve
                 resolve(base64)

                //延迟600ms,避免部分机型未绘制出图片内容就执行保存操作,导致最终的图片是块白色画板。
                // setTimeout(() => {
                // wx.canvasToTempFilePath({
                //     fileType: "jpg",
                //     canvas: canvas,
                //     destWidth: picWidth,
                //     destHeight: picHeight,
                //     success: function (res) {
                //     return resolve(res.tempFilePath) //返回压缩后的图片
                //     }
                // }, _this)
                // }, 600)
            }
            } catch (e) {
                //异常后的操作
            }
        })
        }
    })
    })
}

完毕,我是把压缩和转url放在了一个方法里面,如果你们也需要压缩后的图片Url,也可以像我一样,直接放在一起

注意:在使用canvas压缩图片的时候,wxml文件中一定要加上,以下代码,不然无法上传图片以后无法显示


<!-- 在压缩中需要用到,这里通过css控制在界面上不可见 -->
<canvas style="width:{{canvasWidth}}px;height:{{canvasHeight}}px;position:fixed;left:100%;" id="picCanvas" type="2d"></canvas>

参考地址:

base64图片转file的处理_base64转file_酸菜鱼很好吃哦1的博客-优快云博客

微信小程序 - 本地图片临时路径转base64 和 远程图片转base64 本地临时图片路径转base64 base64({url,type}){ return new Promise((resolve, reject) => { wx.getFileSystemManager().readFile({ filePath: url, //选择图片返回的相对路径 encoding: 'base64... 阅读详情

相关推荐

前端图片转base64,并使用canvas对图片进行压缩

图片转base64通常用在用户上传图片的情况下使用,他的作用就是让用户看到预览的图片不受网络的影响。:首先是用户选择图片上传至服务器,服务器保存接收返回一个url地址,然后客户端带着这个url地址再去请求图片,最后才拿到用户上传的图片预览,这个过程如果是网络不好的情况,很影响用户的体验。在上传的时候不需要依赖服务器的请求,直接在客户端就进行转换,利用的是文件IO读取,这个不受网络IO的影响,并且比网络要快的多并且如果有编辑图片的需求,是不是又得重新进行一次第一步的步骤,如果网络不好,非常的影响用户的体验。

m0_64642443的博客 1723

Java 图片URL转Base64编码

前言 实现方式:通过图片URL获取二进制流,再对字节数组进行Base64编码转换 具体实现 实现类 import sun.misc.BASE64Encoder; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; import java.util.regex.Matcher; import java.util.r

Maggieq8324的博客 1万+

美图前端面经:Canvas/WebGL影像性能优化与图片处理实战复盘

前端性能优化是工程实践的核心能力,尤其在图片处理与影像类业务中,Canvas渲染、WebGL像素级操作、图片压缩与上传、移动端适配等环节,直接决定了用户体验的流畅度与稳定性。理解浏览器从图片请求、解码到合成显示的完整链路,掌握离屏Canvas、requestAnimationFrame、对象URL释放、并发控制等关键技术,能够帮助开发者系统性地解决渲染卡顿、内存泄漏与加载缓慢等常见问题。这些技术不仅广泛应用于图片编辑、滤镜特效、批量上传等真实业务场景,更是影像类前端岗位的高频考察重点。本文基于一场真实的美图

weixin_34348805的博客 363

图片URL以及上传的图片文件转base64

图片URL以及上传的图片文件转base64

weixin_54526156的博客 1714

前端开发者的福音:tiff.js + Canvas 实现 TIFF 图片预览的完整指南

本文详细介绍了如何利用tiff.js和Canvas技术在前端实现TIFF图片的高效预览,解决了浏览器无法原生渲染TIFF文件的难题。通过完整的代码示例和性能优化策略,开发者可以轻松构建零依赖、高性能的TIFF在线预览系统,适用于医疗影像、工程图纸等专业场景。

weixin_29008805的博客 260

Canvas滑块验证码背景图还原算法深度解析与逆向实战

在Web安全与自动化测试领域,验证码识别是常见的挑战。其核心原理在于利用图像生成技术,在前端动态创建难以被机器直接解析的视觉谜题。Canvas作为HTML5的核心绘图技术,能够通过JavaScript指令实时生成复杂图像,这为验证码的动态化、抗破解提供了技术基础。其技术价值在于实现了服务器端仅下发轻量级绘图指令与种子数据,客户端动态渲染的防御模式,极大增加了传统静态图片下载分析方式的破解难度。典型的应用场景包括登录防护、反爬虫机制等,通过在前端执行复杂的绘图逻辑来对抗自动化脚本。本文聚焦于顶象滑块验证码,深

weixin_30252709的博客 464

前端必看:用Canvas轻松压缩图片并玩转Base64与File互转

一条“File → Canvas → File”的完整流水线;一套“尺寸/品质/格式”三维可调的黄金参数表;一张“兼容性坑位”的排雷地图;一把“调试 + 定位”的尺子;还有无数“裁剪、离线、Worker、雪碧图”的骚操作。下次再遇到“图片太大”的警告,你就可以淡定地喝一口咖啡,敲下,然后对产品经理说:“放心,我已经把 10MB 砍到 800KB,画质还比朋友圈高。这就是前端人的浪漫——用一行代码,帮用户省下一兆流量;用一张画布,把世界看得更清晰。(完整可运行仓库已放在。

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 1083

富文本编辑器粘贴Word图片保留超链接:剪贴板解析与重建实践

富文本编辑器是Web开发中常见的内容创作工具,处理来复杂的粘贴内容时,经常遇到图片丢失、超链接失效等问题。从Word复制内容时,剪贴板中生成的HTML包含大量私有标记,图片可能以本地文件路径或VML形式存在,而超链接也容易在默认粘贴流程中被编辑器白名单剥离。理解剪贴板数据结构与DOM解析原理,可以帮助开发者安全地重建图片和链接节点,确保内容迁移的完整性。该技术广泛应用于后台管理系统、在线文档、协同办公平台等需要处理Word内容导入的场景。本文详细讲解了基于DOMParser的解析流程、pt与px尺寸换算、图

weixin_33971721的博客 92

Lexical 富文本编辑器图片处理实战:上传、裁剪与多端预览的 5 个关键决策

手机上图片糊、桌面端首屏加载慢、裁剪全靠用户手动拖框。这三个体验问题,是 Lexical 富文本编辑器图片处理里最常见的抱怨,而且它们都不是单点问题,是链路问题。这篇文章以官方 playground 的图片扩展为参照,把「入口 → 预处理 → 渲染」整条链路拆开讲。读完你能把三种上传入口收敛成一条统一管线,搭好入库前的整形处理,并让同一张图在多端都显示正确。 ## 先做选择:3 个自检问题定路线

gitblog_00425的博客 239

AI绘图平台水印绕过原理与实操:从DOM叠加到API直取

AI生成图像中的水印并非图像缺陷,而是平台在内容分发环节实施的品牌标记行为。其技术本质分为三类:前端DOM悬浮层、服务端像素合成、频域数字水印。当前主流平台(如豆包、即梦)普遍采用L1级DOM水印,依赖CSS或Canvas覆盖实现,具备可绕过性;而真正稳定获取无水印图的关键,在于理解Web界面与API通道的权限鸿沟——前者面向用户强绑定品牌,后者面向开发者遵循最小干预原则,返回原始位图。掌握前端渲染逻辑分支(如‘变清晰’触发未注入路径)、画布重载机制、以及多模型API聚合调用(如Lovart.ai),即可在

weixin_33906657的博客 504

Chrome侧边栏实现免安装Android投屏与提单闭环

WebUSB、WebRTC DataChannel 和 Service Worker 是现代浏览器原生支持的设备通信与实时交互核心技术,它们共同构成了免客户端、零部署的跨端协作基础设施。相比传统基于 ADB 的桌面投屏方案,这类纯前端架构消除了驱动依赖、权限弹窗和多工具切换等工程摩擦,显著降低 QA 场景下的问题复现与反馈门槛。尤其在测试工程师高频连接多台真机、产品经理需快速同步线上 Bug 的典型场景中,TabQA 范式将‘投屏-标注-提单’压缩至单个 Chrome Tab 侧边栏内完成,依托 WebUS

weixin_33795806的博客 415

【SenseNova U1.5 Lite 实战】少儿外教培训场景下的AI情景对话工作流——从出图、配音到离线绘本的完整落地

用SenseNova U1.5 Lite AI模型,结合Edge-TTS真人配音与PIL排版,仅用一周时间打造了一套张英语启蒙对话卡,生成可离线播放的HTML绘本。通过“画+声+互动”模式,让孩子在真实情境中理解并主动跟读英文问候语。项目实现全流程自动化,支持本地部署与分享,真正解决“孩子听不懂、家长不会演”的启蒙难题。

wdracky的专栏 2420

wangEditor自定义上传实战:集成阿里云OSS与性能优化指南

文件上传是Web开发中的基础功能,其核心原理涉及前端文件对象处理、HTTP传输协议及服务端存储机制。在富文本编辑器场景下,默认上传方案通常采用标准表单提交,适用于简单服务端处理。然而,随着应用复杂度提升,特别是需要对接第三方云存储(如阿里云OSS、腾讯云COS)或实现精细控制(如进度显示、断点续传)时,开发者需掌握自定义上传能力。自定义上传技术通过将文件处理逻辑完全交由开发者控制,实现了与云存储SDK的无缝集成,并能灵活处理文件压缩、秒传校验等高级需求。本文以wangEditor的customUpload方

weixin_33766168的博客 382

PaddleSeg 移动端语义分割选型:MobileNetV3 与 ShuffleNetV2 的 80k 实测数据与三条部署路径

边缘盒子做实时分割,帧率指标被定在 30 FPS,但 PaddleSeg 里基于 HRNet 的轻量骨干 Lite_HRNet_18 在安卓 CPU 上实测只有 13.05 FPS,即便 V100 加 TensorRT 也只有 10.5 FPS。PaddleSeg 语义分割库中移动端的 MobileSeg 与 PP-MobileSeg 两组 80k 实测数据,足够支撑一次完整选型:五个轻量骨干、两

gitblog_01139的博客 631

滑块验证码逆向与风控分析:从缺口识别到加密参数破解实战

滑块验证码作为现代Web安全中常见的人机交互验证机制,其核心原理在于通过图像识别和行为轨迹分析来区分人类用户与自动化脚本。从技术实现层面看,它通常涉及前端资源动态加载、缺口位置计算、拟人化轨迹生成以及关键参数的加密传输。这种机制的技术价值在于构建了多层防御体系,不仅作为显性挑战,更充当了隐性的行为指纹采集器,广泛应用于金融、社交、电商等平台的登录、注册及敏感操作场景,以防范恶意爬虫和自动化攻击。本文以某财经资讯平台为例,深入剖析了其滑块验证的完整风控链路,重点探讨了如何通过图像处理技术进行缺口定位,并设计拟

weixin_34062469的博客 399

多图片上传预览实战:从FileReader到内存泄漏避坑与生产优化

在浏览器中实现文件上传与本地预览是前端开发的高频需求。围绕 input[type=file] 的 change 事件、FileReader 与 URL.createObjectURL 两条技术路线,开发者可以快速构建图片即时预览能力。然而实际项目中常遇到内存泄漏、文件类型过滤、重复选择失效等边界问题,尤其在多图片场景下,若未正确释放对象 URL 或处理异步时序,很容易导致页面卡顿甚至白屏。本文以工程实践视角,剖析 FileReader 与 createObjectURL 的原理差异,给出 HTML5 多图片

weixin_34026997的博客 320

终极指南:5分钟掌握Node-QRCode的强大二维码生成功能

Node-QRCode是一个功能强大、跨平台的JavaScript二维码生成库,支持服务器端和客户端环境,已经成为Node.js生态系统中QR码生成的标准解决方案。无论你是前端开发者需要为网页添加二维码功能,还是后端工程师需要在服务器端生成二维码,Node-QRCode都能提供简单高效的解决方案。本文将带你全面了解这个强大的二维码生成工具,从快速入门到高级用法,让你在5分钟内就能开始使用这个优秀的

gitblog_00827的博客 604

微信小程序背单词实战:纯前端架构与记忆算法实现

背单词小程序是典型的轻量级教育应用,其核心在于如何在微信小程序有限的运行环境下,平衡性能、体验与认知科学原理。理解小程序的纯前端状态管理机制、本地存储策略及分包异步加载逻辑,是构建高响应教育工具的基础;而艾宾浩斯遗忘曲线等记忆算法的手动实现,则将心理学模型转化为可落地的JS逻辑,赋予产品真正的学习价值。结合单选交互反馈、导航栏适配、视频兼容性处理等工程细节,这类项目广泛应用于语言学习、K12辅导、职业考试等场景,成为验证小程序工程化能力的标杆案例。

weixin_34209851的博客 446
上一篇: 【自用笔记】小程序中使用七牛云上传图片
下一篇: 【自用笔记】小程序 van-uploader 压缩图片
林希雨
博客等级 码龄4年 84粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值