貌似 HTML5 的 Canvas 只提供了图片的旋转、缩放功能,没有提供图片翻转(水平翻转或垂直翻转)的支持,搜索加试验之后,得到几种实现图片翻转的方法,记录一下。

第一种最简单的是使用 CSS,代码片断如下:

.flip-x {

filter: FlipH; /* IE only */

-moz-transform: matrix(-1, 0, 0, 1, 0, 0);

-webkit-transform: matrix(-1, 0, 0, 1, 0, 0);

}

支持 IE 、Firefox 等各大浏览器。不过,如果想在 HTML5 的 Canvas 中翻转一个图片,CSS 就无能为力了。

在 Canvas 中翻转图片大致有两种思路,一种是先“翻转”画布,在上面画好需要的图片后再将画布“翻转”回来;另一种是先在画布上正常画上原图,用 getImageData 方法取得图片的每一个象素的数据,再将数据镜像交换一下。

先来看“翻转”画布的方法,代码大致类似于这样:

// 正常绘制:

// ctx.drawImage(img, px, py);

// 水平“翻转”画布

ctx.translate(canvas_width, 0);

ctx.scale(-1, 1);

// 下面画的图片是水平翻转的

ctx.drawImage(img, canvas_width - img.width - px, py);

// 画布恢复正常

ctx.translate(canvas_width, 0);

ctx.scale(-1, 1);

可以看到,主要用到了 translate 以及 scale 方法。先用 translate 方法将坐标原点设为画布右上角(默认为左上角),再用 scale(-1, 1) 的方式将画布水平翻转,在上面画好图之后再恢复即可。

另一种象素级的操作原理上也非常简单,就不多解释了,可以直接看源码:

test

#cv {

border: solid 1px #333;

}

var canvas = document.getElementById("cv"),

ctx = canvas.getContext("2d"),

img = new Image();

img.src = "/images/oldj_gmail.png";

function show() {

// 正常图片

ctx.drawImage(img, 10, 10);

// 水平翻转

ctx.translate(300, 0);

ctx.scale(-1, 1);

// 下面画的图片是水平翻转的

ctx.drawImage(img, 300 - img.width - 10, 60);

// 恢复正常

ctx.translate(300, 0);

ctx.scale(-1, 1);

// 下面的图片是正常的

ctx.drawImage(img, 10, 110);

// 象素级水平翻转图片的方法

show2();

}

function show2() {

// 象素级水平翻转的方法

// 先画一个正常的画片

var px = 10,

py = 160;

ctx.drawImage(img, px, py);

// 取得这个图片的数据,图片与当前页面必须同域,否则会出错

var img_data = ctx.getImageData(px, py, img.width, img.height),

x, y, p, i, i2, t,

h = img_data.height,

w = img_data.width,

w_2 = w / 2;

// 将 img_data 的数据水平翻转

for (y = 0; y < h; y ++) {

for (x = 0; x < w_2; x ++) {

i = (y<<2) * w + (x<<2);

i2 = ((y + 1) << 2) * w - ((x + 1) << 2);

for (p = 0; p < 4; p ++) {

t = img_data.data[i + p];

img_data.data[i + p] = img_data.data[i2 + p];

img_data.data[i2 + p] = t;

}

}

}

// 重绘水平翻转后的图片

ctx.putImageData(img_data, px, py);

}

img.onload = function () {

show();

};

最终效果如下图所示:

如果你的浏览器支持 Canvas 标签,你也可以点击这儿查看示例。

不过,上面提到的两种方法都不是 HTML5 Canvas 原生支持的,性能上一定会有所损失。如果要频繁地翻转某个图像,看起来最好的办法还是先给它做一个镜像版本,而不是在程序里再翻转。

设计图片转换html5,在HTML5中翻转图片相关推荐

  1. word 图片导入不翻转_如何在Microsoft Word中翻转图片

    word 图片导入不翻转 While Microsoft Word isn't known for its photo-editing abilities, it does have some bas ...

  2. 如何将图片转换成表格?这有图片转换成表格好用方法

    如何将图片转换成表格?这有图片转换成表格好用方法 在日常办公和学习中,我们常常需要将图片中的表格转换成可编辑的文本格式.这时候,一些优秀的软件可以帮助我们快速地完成这项工作.你知道如何将图片转换成表格 ...

  3. c 将图片存入到mysql数据库中_如何将图片转换存入到数据库中,并从数据库中取出转换成图片...

    有时候我们想把图片存入到数据库中,尽管这不是一种明智的选择,但有时候还是不得以会用到,下面说说将图片转换成byte[]数组存入到数据库中去,并从数据库中取出来转换成图像显示出来. 首先,我们要把图片存 ...

  4. linux终端查看文件夹图片,如何在Linux终端中显示图片

    Linux 上有许多 GUI 图片浏览器.但我尚未听说或使用过任何在终端中显示图片的应用程序.幸运的是,我刚刚发现了一个可用于在终端中显示图像的名叫 FIM 的图像查看器.FIM 引起了我的注意,是因 ...

  5. php 把图片转换成二进制流,php把图片转换成二进制流的方法

    PHP中的isset() 函数用于检测变量是否已声明并且非 NULL.该函数返回布尔类型的值,即true/false.格式:bool isset ( mixed var [, mixed var [, ...

  6. 将mysql数据库中的图片读出来的_MySQL存入图片+Qt读入读出数据库中的图片

    还记得之前的一个项目里要向数据库中存入图片,然后Qt要在数据库中读入读出图片,当时纠结了好久,查阅了很多资料才解决,所以希望本文能给需要朋友点帮助.好了废话不多说,下面开始讲实现步骤. 1.MySQL ...

  7. python读取excel图片尺寸_Python读取excel中的图片完美解决方法

    excel中有图片是很常见的,但是通过python读取excel中的图片没有很好的解决办法. 网上找了一种很聪明的方法,原理是这样的: 1.将待读取的excel文件后缀名改成zip,变成压缩文件. 2 ...

  8. java 图片动画_java在窗口中添加图片做动画,怎么一闪一闪的?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 视频来自:优酷 在java中添加图片做动画效果,怎么一闪一闪的运动啊?怎样才能让它不闪的连续运动呢? 下面是代码,代码项目project里有两个类,一个是 ...

  9. Java代码服务器上下载图片_Java如何从服务器中下载图片

    import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net ...

最新文章

  1. L3-010. 是否完全二叉搜索树
  2. HDU 1028 HDU Ignatius and the Princess III
  3. 作业调度算法--短作业优先 操作系统_处理器管理_编程题
  4. ubuntu shell实现99乘法表
  5. springboot aop使用_Spring Boot 的自动配置,是如何实现的?
  6. Docker(二):Docker常用命令之镜像的创建:Dockerfile 与 commit
  7. 轩辕传奇服务器合并信息,轩辕传奇9月1日部分服务器合服公告
  8. python支持中文路径_打开python遍历中文目录得到的文件路径报错
  9. Spring Cloud 服务安全连接 1
  10. Python工具箱系列(十一)
  11. 【ClearCase 学习笔记 】之(1/4)CC四大功能概述
  12. 机器学习实例-决策树和随机森林预测员工离职率
  13. 基于Jsp的手机应用商店的设计与实现mysql
  14. 狄利克雷分布公式_关于狄利克雷分布的理解
  15. 外包or外派岗,可以去?
  16. python3 中解决\u8bf7\u6c42\u6210\u529f“格式编码问题
  17. 2019校招面经大汇总
  18. CDN防护和高防服务器哪个更适合网站?
  19. 以太坊(Ethereum) - 什么是智能合约
  20. nginx已经启动 无法访问页面

热门文章

  1. 兔子数列规律怎么讲_神奇兔子数列
  2. 最短Hamilton路径(哈密顿图,状压dp)
  3. 硬件设计中电容电感磁珠总结
  4. Web前端学习笔记07:CSS_高级技巧_定位
  5. errorreporting php,php-phpin的error_reporting 22527中的22527是什么
  6. 云和大数据,铺就宁夏特色“信息高速路”
  7. spring clude ---服务网关组件Netflix Zuul
  8. 反射知识点总结《Lipp学习笔记》
  9. 软件开发工具【七】 之 Eclipse入门
  10. 论文投稿指南——中国(中文EI)期刊推荐(第4期)