uni-app如何实现图片镜像翻转

秋涛小哥_9722

秋涛小哥_9722

2026-08-20

883人浏览

原创

uni-app实现图片镜像翻转必须用canvas绘制,不能依赖css transform;需在onready中调用uni.createcanvascontext('mycanvas', this)绑定上下文,再通过ctx.translate与ctx.scale组合实现水平或垂直翻转,并确保ctx.draw(true, callback)完成后再调用canvastotempfilepath导出。

uni-app如何实现图片镜像翻转

uni-app 实现图片镜像翻转,必须用 canvas 绘制,不能靠 CSS 的 transform: scaleX(-1) —— 因为后者只改显示,导出或上传时仍是原方向。


镜像翻转前必须先获取 canvas 上下文且绑定 this

常见错误是把 uni.createCanvasContext 放在 onLoad 或方法里直接调用,结果上下文没绑定组件实例,绘图失败。

  • uni.createCanvasContext('myCanvas', this) 第二个参数 this 不可省略,否则 ctx 无法访问组件 data 和生命周期
  • 必须在 onReady 中初始化:
    onReady() {
      this.ctx = uni.createCanvasContext('myCanvas', this)
    }
  • 后续所有 ctx.drawImagectx.scale 操作都依赖这个已绑定的 ctx

水平/垂直镜像:用 ctx.scale(-1, 1)ctx.scale(1, -1)

直接调 ctx.scale(-1, 1) 会让坐标系翻转,但图像会画到画布外(负坐标区域),必须配合 ctx.translate 把原点移到右侧或底部。

uni-app
uni-app

uni-app 是基于 Vue 的跨端开发框架,适合开发 H5、App、小程序、鸿蒙和多端业务应用。

下载
  • 水平镜像(左右翻):
    ctx.translate(canvasWidth, 0)
    ctx.scale(-1, 1)
  • 垂直镜像(上下翻):
    ctx.translate(0, canvasHeight)
    ctx.scale(1, -1)
  • 注意:canvasWidthcanvasHeight 必须是整数,且等于目标图片原始宽高(比如图片 600×400,canvas 的 widthheight 属性也得设为 600400
  • 别用 CSS 的 style.width/style.height 控制缩放,那只是显示比例,不影响实际绘制像素范围

base64 图片加载时机错乱导致绘图为空

new Image() 加载 base64 字符串时,onload 可能同步触发(尤其缓存命中),而此时 this.ctx 还没创建好,绘图就静默失败。

  • 正确做法:设标志位,分离加载与绘制逻辑
    this.img = new Image()
    this.img.onload = () => { this.imgReady = true; this.tryDraw() }
    this.img.src = 'data:image/png;base64,...'
  • tryDraw() 中判断:
    if (this.ctx && this.imgReady) {
      this.ctx.drawImage(this.img, 0, 0)
      this.ctx.draw()
    }
  • 高清 base64 图(宽高 >1000px)容易触发内存警告,建议提前压缩或限制最大尺寸

导出镜像后图片仍是原方向?检查 canvasToTempFilePath 调用时机

真机上常出现「明明画了镜像,保存出来却是正的」——根本原因是没等 ctx.draw() 完成就调了保存 API。

  • 必须传入 draw 的回调:
    this.ctx.draw(true, () => {
      uni.canvasToTempFilePath({
        canvasId: 'myCanvas',
        success: (res) => { /* res.tempFilePath 即镜像图 */ }
      })
    })
  • H5 和小程序平台的 uni.canvasToTempFilePath 行为一致,但 App 端(iOS/Android)需确认是否支持该 API;若不支持,需 fallback 到 canvas.toDataURL(H5)或原生插件
  • iOS 上 canvas 宽高为 0 或未设 style 尺寸,会导致保存白图,务必检查 <canvas></canvas>widthheight:style 是否匹配

镜像本身很简单,真正卡住人的永远是上下文绑定、异步时机、像素尺寸对齐这三处。尤其是 this.ctx 初始化位置和 ctx.draw() 的回调使用,漏掉任何一个,图就“画了但没画”。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2023

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

4323

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

5430

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

4878

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

683

5

css3教程
css3教程

php中文网为大家提供css3教程合集,CSS3的语法是建立在CSS原先版本基础上的,它允许使用者在标签中指定特定的HTML元素而不必使用多余的class、ID或JavaScript。php中文网还为大家带来css3的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.14

1640

10

有哪些css3渐变属性
有哪些css3渐变属性

css3中渐变属性有linear-gradient、radial-gradient、conic-gradient、repeating-linear-gradient、repeating-radial-gradient等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.11.01

2126

5

html5动画制作有哪些制作方法
html5动画制作有哪些制作方法

html5动画制作方法有使用CSS3动画、使用JavaScript动画库、使用HTML5 Canvas等。想了解更多html5动画制作方法相关内容,可以阅读本专题下面的文章。

2023.10.23

3411

6

canva可画使用技巧汇总
canva可画使用技巧汇总

本专题汇集了PHP中文网精心整理的Canva可画新手使用技巧大全,专为零基础用户打造。无论你是想制作精美海报、PPT还是社交媒体配图,这里都有从注册登录、模板搜索到AI辅助设计、导出分享的全流程保姆级教程。通过深入浅出的图文指南,帮助你快速跨越设计门槛,轻松掌握Canva可画的实用操作,让每个人都能成为设计达人!

2026.05.19

204

21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
uni-app从入门到实战教程
uni-app从入门到实战教程

共0课时 | 0人学习

uni-app x harmony开发指南
uni-app x harmony开发指南

共0课时 | 0人学习

uni-app鸿蒙运行和发行
uni-app鸿蒙运行和发行

共0课时 | 0人学习