canvas操作图片,进行面板画图,旋转等
HTML5 <canvas> 标签用于绘制图像(通过脚本,通常是 JavaScript)。
不过,<canvas> 元素本身并没有绘制能力(它仅仅是图形的容器) - 您必须使用脚本来完成实际的绘图任务。
getContext() 方法可返回一个对象,该对象提供了用于在画布上绘图的方法和属性。
本手册提供完整的 getContext("2d") 对象属性和方法,可用于在画布上绘制文本、线条、矩形、圆形等等。
浏览器支持
Internet Explorer 9、Firefox、Opera、Chrome 以及 Safari 支持 <canvas> 及其属性和方法。
注释:Internet Explorer 8 以及更早的版本不支持 <canvas> 元素。
颜色、样式和阴影
| 属性 | 描述 |
|---|---|
| fillStyle | 设置或返回用于填充绘画的颜色、渐变或模式 |
| strokeStyle | 设置或返回用于笔触的颜色、渐变或模式 |
| shadowColor | 设置或返回用于阴影的颜色 |
| shadowBlur | 设置或返回用于阴影的模糊级别 |
| shadowOffsetX | 设置或返回阴影距形状的水平距离 |
| shadowOffsetY | 设置或返回阴影距形状的垂直距离 |
| 方法 | 描述 |
|---|---|
| createLinearGradient() | 创建线性渐变(用在画布内容上) |
| createPattern() | 在指定的方向上重复指定的元素 |
| createRadialGradient() | 创建放射状/环形的渐变(用在画布内容上) |
| addColorStop() | 规定渐变对象中的颜色和停止位置 |
线条样式
| 属性 | 描述 |
|---|---|
| lineCap | 设置或返回线条的结束端点样式 |
| lineJoin | 设置或返回两条线相交时,所创建的拐角类型 |
| lineWidth | 设置或返回当前的线条宽度 |
| miterLimit | 设置或返回最大斜接长度 |
矩形
| 方法 | 描述 |
|---|---|
| rect() | 创建矩形 |
| fillRect() | 绘制“被填充”的矩形 |
| strokeRect() | 绘制矩形(无填充) |
| clearRect() | 在给定的矩形内清除指定的像素 |
路径
| 方法 | 描述 |
|---|---|
| fill() | 填充当前绘图(路径) |
| stroke() | 绘制已定义的路径 |
| beginPath() | 起始一条路径,或重置当前路径 |
| moveTo() | 把路径移动到画布中的指定点,不创建线条 |
| closePath() | 创建从当前点回到起始点的路径 |
| lineTo() | 添加一个新点,然后在画布中创建从该点到最后指定点的线条 |
| clip() | 从原始画布剪切任意形状和尺寸的区域 |
| quadraticCurveTo() | 创建二次贝塞尔曲线 |
| bezierCurveTo() | 创建三次方贝塞尔曲线 |
| arc() | 创建弧/曲线(用于创建圆形或部分圆) |
| arcTo() | 创建两切线之间的弧/曲线 |
| isPointInPath() | 如果指定的点位于当前路径中,则返回 true,否则返回 false |
转换
| 方法 | 描述 |
|---|---|
| scale() | 缩放当前绘图至更大或更小 |
| rotate() | 旋转当前绘图 |
| translate() | 重新映射画布上的 (0,0) 位置 |
| transform() | 替换绘图的当前转换矩阵 |
| setTransform() | 将当前转换重置为单位矩阵。然后运行 transform() |
文本
| 属性 | 描述 |
|---|---|
| font | 设置或返回文本内容的当前字体属性 |
| textAlign | 设置或返回文本内容的当前对齐方式 |
| textBaseline | 设置或返回在绘制文本时使用的当前文本基线 |
| 方法 | 描述 |
|---|---|
| fillText() | 在画布上绘制“被填充的”文本 |
| strokeText() | 在画布上绘制文本(无填充) |
| measureText() | 返回包含指定文本宽度的对象 |
图像绘制
| 方法 | 描述 |
|---|---|
| drawImage() | 向画布上绘制图像、画布或视频 |
像素操作
| 属性 | 描述 |
|---|---|
| width | 返回 ImageData 对象的宽度 |
| height | 返回 ImageData 对象的高度 |
| data | 返回一个对象,其包含指定的 ImageData 对象的图像数据 |
| 方法 | 描述 |
|---|---|
| createImageData() | 创建新的、空白的 ImageData 对象 |
| getImageData() | 返回 ImageData 对象,该对象为画布上指定的矩形复制像素数据 |
| putImageData() | 把图像数据(从指定的 ImageData 对象)放回画布上 |
合成
| 属性 | 描述 |
|---|---|
| globalAlpha | 设置或返回绘图的当前 alpha 或透明值 |
| globalCompositeOperation | 设置或返回新图像如何绘制到已有的图像上 |
其他
| 方法 | 描述 |
|---|---|
| save() | 保存当前环境的状态 |
| restore() | 返回之前保存过的路径状态和属性 |
| createEvent() | |
| getContext() | |
| toDataURL() |
w3ch文档是上面的。
难点在于旋转中心的确定。
第一版代码:
<html>
<head>
<style type="text/css">
#img{
border: solid 1px red;
width:500px;
height:500px;
position:relative;
}
#canvas_myimg{
position:absolute;
top:50%;
left:50%;
} #myimg{
position:absolute;
top:50%;
left:50%;
width:400;
height:400; } </style>
<script src="jquery-1.6.1.min.js"></script>
<script language="javascript">
var width = 400;
var height = 400;
var changePx = 50; function center(){
$("#canvas_myimg").css({'margin-left':-width/2,'margin-top':-height/2});
} function rotate(arr){
var img = document.getElementById("myimg");
if(!img){return false;} n = (n == null) ? 0 : n;
if(arr == 'left'){
n = (parseInt(n) + parseInt(3))%4;
}else if(arr == 'right'){
n = (parseInt(n) + parseInt(1))%4;
}else if(arr == 'reversal'){
n = (parseInt(n) + parseInt(2))%4;
}
img.setAttribute("step",n); //对IE浏览器使用滤镜旋转
if(document.all) {
img.style.filter = 'progid:DXImageTransform.Microsoft.BasicImage(rotation='+ n +')';
// 对现代浏览器写入HTML5的元素进行旋转: canvas
}else{
var c = document.getElementById("canvas_myimg");
if(c == null){
img.style.visibility = 'hidden';
img.style.position = 'absolute';
c = document.createElement('canvas');
c.setAttribute("id",'canvas_myimg');
img.parentNode.appendChild(c);
}
var canvasContext = c.getContext('2d');
switch(n) {
case 0 :
canvasContext.rotate(0 * Math.PI / 180);
canvasContext.drawImage(img, 0, 0 , width , height);
break;
case 1 :
canvasContext.rotate(90 * Math.PI / 180);
canvasContext.drawImage(img, 0, -height , width , height);
break;
case 2 :
canvasContext.rotate(180 * Math.PI / 180);
canvasContext.drawImage(img, -width, -height , width , height);
break;
case 3 :
canvasContext.rotate(270 * Math.PI / 180);
canvasContext.drawImage(img, -width, 0 , width , height);
break;
}
center();
}
} function change(arr){
var newWidth = 0;
var newHeight = 0;
if(arr == 'add'){
newWidth = parseInt(width) + parseInt(changePx);
newHeight = parseInt(height) + parseInt(changePx);
}else if(arr == 'multiple'){
newWidth = parseInt(width) - parseInt(changePx);
newHeight = parseInt(height) - parseInt(changePx);
}
if(newWidth <= 700 && newHeight <= 700 && newWidth >= 100 && newHeight >= 100){
width = newWidth;
height = newHeight;
}
rotate(0);
} $(function(){
$("#myimg").css({'margin-left':-width/2,'margin-top':-height/2});
rotate(0);
})
//$("#myimg").onload = function(){
//} </script>
</head>
<body>
<div id="tool">
<a href="#" id="arr_left" onclick="rotate('left')">向左</a>
<a href="#" id="arr_right" onclick="rotate('right')">向右</a>
<a href="#" id="arr_reversal" onclick="rotate('reversal')">反转</a>
<a href="#" id="add" onclick="change('add')">加大</a>
<a href="#" id="multiple" onclick="change('multiple')">缩小</a>
</div>
<div id="img" class="img">
<img src="temp.jpg" alt="" id="myimg"/>
</div> </body>
</html>
朋友版本代码:
<html>
<head>
<style type="text/css">
.img {
background: #8b91a2;
width: 500px;
height: 500px;
position: relative;
} .myimg {
display: block;
margin: auto auto;
width: 300px;
height: 300px;
position: absolute;
top: 50%;
left: 50%;
} .transimg {
-webkit-transform: rotate(90deg);
-moz-transform: rotate(90deg);
-ms-transform: rotate(90deg);
-o-transform: rotate(90deg);
transform: rotate(90deg);
}
</style>
</head>
<body>
<div id="tool">
<a href="#" class="left">向左</a>
<a href="#" class="right">向右</a>
<a href="#" class="arr_reversal">反转</a>
<input id="btn1" type="button" value="放大" class="big"/>
<input id="btn2" type="button" value="缩小" class="small"/>
</div>
<div id="img" class="img">
<img src="img/afour.png" alt="" id="myimg" class="myimg"/>
</div> <script type="text/javascript" src="js/jquery-1.8.3.min.js"></script>
<script type="text/javascript"> $(function () {
local();
var current = 0;
//向右
$('.right').click(function () {
current = (current + 90) % 360;
$('.img').css('transform', 'rotate(' + current + 'deg)')
})
//反转
$('.arr_reversal').click(function () {
current = (current + 180) % 360;
$('.img').css('transform', 'rotate(' + current + 'deg)')
})
//向左
$('.left').click(function () {
current = (current - 90) % 360;
$('.img').css('transform', 'rotate(' + current + 'deg)')
})
//获取外层大宽高
var divwidth = $('.img').width();
var divheight = $('.img').height();
//变大
$('.big').click(function () {
var imgwidth = $('.myimg').width();
var imgheight = $('.myimg').height();
if (divheight - imgheight > 50 && divwidth - imgwidth > 50) {
ImageSuofang(true);
local();
}
})
//变小
$('.small').click(function () {
var imgwidth = $('.myimg').width();
var imgheight = $('.myimg').height();
if (imgheight >= 100 && imgwidth >= 100) {
ImageSuofang(false);
local();
}
})
//变大变小的方法
function ImageSuofang(args) {
var oImgwidth = $('.myimg').width();
var oImgheight = $('.myimg').height();
if (args) {
$('.myimg').css('width', oImgwidth * 1.1)
$('.myimg').css('height', oImgheight * 1.1)
}
else {
$('.myimg').css('width', oImgwidth / 1.1)
$('.myimg').css('height', oImgheight / 1.1)
}
}
//定位
function local() {
var width = $('.myimg').width();
var height = $('.myimg').height();
$('.myimg').css({'margin-left': -width / 2, 'margin-top': -height / 2})
}
}); </script>
</body>
</html>
最终版代码:
<html>
<head>
<script type="text/javascript">
var canvas;
var context;
var image;
var minWidth = 50;
var minHeight = 50;
var imgWidth = 100;
var imgHeight = 100;
var changeRate = 0.3;
var maxWidth = 500;
var maxHeight = 500; window.onload = function(){
image = document.getElementById("src_img");
canvas = document.getElementById("cg_img");
var x = canvas.width/2;
var y = canvas.height/2;
context = canvas.getContext("2d");
rotate(360);
}
function rotate(angle,oper){
if(oper != null){
var tempWidth = parseInt(imgWidth) + parseInt(oper) * parseInt(imgWidth * changeRate);
var tempHeight = parseInt(imgHeight) + parseInt(oper) * parseInt(imgHeight * changeRate)
imgWidth = tempWidth > maxWidth ? maxWidth : (tempWidth < minWidth ? minWidth : tempWidth);
imgHeight = tempHeight > maxHeight ? maxHeight : (tempHeight < minHeight ? minHeight : tempHeight);
}
image.style.visibility = 'hidden';
var x = canvas.width/2;
var y = canvas.height/2;
context.clearRect(0,0,canvas.width,canvas.height);
context.translate(x,y);
context.rotate(Math.PI/180 * angle);
context.translate(-x,-y);
var z = (parseInt(canvas.width) - parseInt(imgWidth)) / 2;
var h = (parseInt(canvas.height) - parseInt(imgHeight)) / 2;
context.drawImage(image,z,h,imgWidth,imgHeight);
}
</script>
</head>
<body>
<div id="tool">
<a href="#" id="arr_left" onclick="rotate(270)">向左</a>
<a href="#" id="arr_right" onclick="rotate(90)">向右</a>
<a href="#" id="arr_reversal" onclick="rotate(180)">反转 </a>
<a href="#" id="add" onclick="rotate(360,1)">加大</a>
<a href="#" id="multiple" onclick="rotate(360,-1)">缩小</a>
</div>
<img src = "temp.jpg" id="src_img"></img>
<canvas id = "cg_img" width="500px" height="500px" style = "border: solid 1px red;">您的浏览器不支持canvas</canvas>
</body>
</html>
参考文章:
http://blog.csdn.net/xiaozhuxmen/article/details/50732038
关于旋转中心:
前两个参数确定旋转中心坐标
后两个参数确定图形的长和宽。
画图也是这样,学会使用数学思想,画回字,解方程得到各边的关系,让图片按你的想法显示。
HTML5 <canvas> 标签用于绘制图像(通过脚本,通常是 JavaScript)。
不过,<canvas> 元素本身并没有绘制能力(它仅仅是图形的容器) - 您必须使用脚本来完成实际的绘图任务。
getContext() 方法可返回一个对象,该对象提供了用于在画布上绘图的方法和属性。
本手册提供完整的 getContext("2d") 对象属性和方法,可用于在画布上绘制文本、线条、矩形、圆形等等。
浏览器支持
Internet Explorer 9、Firefox、Opera、Chrome 以及 Safari 支持 <canvas> 及其属性和方法。
注释:Internet Explorer 8 以及更早的版本不支持 <canvas> 元素。
颜色、样式和阴影
| 属性 | 描述 |
|---|---|
| fillStyle | 设置或返回用于填充绘画的颜色、渐变或模式 |
| strokeStyle | 设置或返回用于笔触的颜色、渐变或模式 |
| shadowColor | 设置或返回用于阴影的颜色 |
| shadowBlur | 设置或返回用于阴影的模糊级别 |
| shadowOffsetX | 设置或返回阴影距形状的水平距离 |
| shadowOffsetY | 设置或返回阴影距形状的垂直距离 |
| 方法 | 描述 |
|---|---|
| createLinearGradient() | 创建线性渐变(用在画布内容上) |
| createPattern() | 在指定的方向上重复指定的元素 |
| createRadialGradient() | 创建放射状/环形的渐变(用在画布内容上) |
| addColorStop() | 规定渐变对象中的颜色和停止位置 |
线条样式
| 属性 | 描述 |
|---|---|
| lineCap | 设置或返回线条的结束端点样式 |
| lineJoin | 设置或返回两条线相交时,所创建的拐角类型 |
| lineWidth | 设置或返回当前的线条宽度 |
| miterLimit | 设置或返回最大斜接长度 |
矩形
| 方法 | 描述 |
|---|---|
| rect() | 创建矩形 |
| fillRect() | 绘制“被填充”的矩形 |
| strokeRect() | 绘制矩形(无填充) |
| clearRect() | 在给定的矩形内清除指定的像素 |
路径
| 方法 | 描述 |
|---|---|
| fill() | 填充当前绘图(路径) |
| stroke() | 绘制已定义的路径 |
| beginPath() | 起始一条路径,或重置当前路径 |
| moveTo() | 把路径移动到画布中的指定点,不创建线条 |
| closePath() | 创建从当前点回到起始点的路径 |
| lineTo() | 添加一个新点,然后在画布中创建从该点到最后指定点的线条 |
| clip() | 从原始画布剪切任意形状和尺寸的区域 |
| quadraticCurveTo() | 创建二次贝塞尔曲线 |
| bezierCurveTo() | 创建三次方贝塞尔曲线 |
| arc() | 创建弧/曲线(用于创建圆形或部分圆) |
| arcTo() | 创建两切线之间的弧/曲线 |
| isPointInPath() | 如果指定的点位于当前路径中,则返回 true,否则返回 false |
转换
| 方法 | 描述 |
|---|---|
| scale() | 缩放当前绘图至更大或更小 |
| rotate() | 旋转当前绘图 |
| translate() | 重新映射画布上的 (0,0) 位置 |
| transform() | 替换绘图的当前转换矩阵 |
| setTransform() | 将当前转换重置为单位矩阵。然后运行 transform() |
文本
| 属性 | 描述 |
|---|---|
| font | 设置或返回文本内容的当前字体属性 |
| textAlign | 设置或返回文本内容的当前对齐方式 |
| textBaseline | 设置或返回在绘制文本时使用的当前文本基线 |
| 方法 | 描述 |
|---|---|
| fillText() | 在画布上绘制“被填充的”文本 |
| strokeText() | 在画布上绘制文本(无填充) |
| measureText() | 返回包含指定文本宽度的对象 |
图像绘制
| 方法 | 描述 |
|---|---|
| drawImage() | 向画布上绘制图像、画布或视频 |
像素操作
| 属性 | 描述 |
|---|---|
| width | 返回 ImageData 对象的宽度 |
| height | 返回 ImageData 对象的高度 |
| data | 返回一个对象,其包含指定的 ImageData 对象的图像数据 |
| 方法 | 描述 |
|---|---|
| createImageData() | 创建新的、空白的 ImageData 对象 |
| getImageData() | 返回 ImageData 对象,该对象为画布上指定的矩形复制像素数据 |
| putImageData() | 把图像数据(从指定的 ImageData 对象)放回画布上 |
合成
| 属性 | 描述 |
|---|---|
| globalAlpha | 设置或返回绘图的当前 alpha 或透明值 |
| globalCompositeOperation | 设置或返回新图像如何绘制到已有的图像上 |
其他
| 方法 | 描述 |
|---|---|
| save() | 保存当前环境的状态 |
| restore() | 返回之前保存过的路径状态和属性 |
| createEvent() | |
| getContext() | |
| toDataURL() |
canvas操作图片,进行面板画图,旋转等的更多相关文章
- canvas插入图片设置背景,渐变
##在canvas中插入图片(需要image对象) 1.canvas操作图片时,必须要等图片加载完才能操作 2.drawImage(image, x, y, width, height) 其中 ima ...
- JAVA对图片的任意角度旋转,以及镜像操作
package relevantTest;/* * 该代码实现了对图像的水平镜像变换,垂直镜像变换,任意角度旋转,jtf的实时监控,以及对图像的缩放变换,以及按钮的若隐若现效果. * 在对图像进行任意 ...
- 图片在 canvas 中的 选中/平移/缩放/旋转,包含了所有canvas的2D变化,让你认识到数学的重要性
1.介绍 canvas 已经出来好久了,相信大家多少都有接触. 如果你是前端页面开发/移动开发,那么你肯定会有做过图片上传处理,图片优化,以及图片合成,这些都是可以用 canvas 实现的. 如果你是 ...
- ASP.NET MVC 网站开发总结(七)——C#操作图片:多张图的拼接(旋转)
其实用C#来操作图片的拼接就是在用Graphic画图.个人感觉还是挺有趣的,各种类库提供了丰富多彩的功能. 源代码(移植到一个简单的C#程序中,并没有放在ASP.NET项目中): using Syst ...
- 赵雅智_运用Bitmap和Canvas实现图片显示,缩小,旋转,水印
上一篇已经介绍了Android种Bitmap和Canvas的使用,以下我们来写一个详细实例 http://blog.csdn.net/zhaoyazhi2129/article/details/321 ...
- 【开源】canvas图像裁剪、压缩、旋转
前言 前段时间遇到了一个移动端对图像进行裁剪.压缩.旋转的需求. 考虑到已有各轮子的契合度都不高,于是自己重新造了一个轮子. 关于图像裁剪.压缩 在HTML5时代,canvas的功能已经非常强大了,可 ...
- canvas图像裁剪、压缩、旋转
转载于:http://www.cnblogs.com/dailc/p/7843204.html 前言 前段时间遇到了一个移动端对图像进行裁剪.压缩.旋转的需求.考虑到已有各轮子的契合度都不高,于是自己 ...
- canvas学习笔记:canvas对图片的像素级处理--ImageData的应用
学习了canvas的基本绘图功能后,惊喜的发现canvas对图片数据也有相当强大的处理功能,能够从像素级别操作位图,当然[lte ie8]不支持. 主要的函数有三个: ctx.createImageD ...
- Android动画及图片的缩放和旋转
Android动画有2种,一种是Tween Animation,另一种是Frame Animation,先说说Tween动画吧. Tween动画是对视图对象中的内容进行一系列简单的转换,比如位置的移动 ...
随机推荐
- 采集baidu搜索信息的java源代码实现(大部分转发,少量自己修改)(使用了htmlunit和Jsoup)(转发:https://blog.csdn.net/zhaohang_1/article/details/44731039)
1.maven依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www ...
- 关闭SourceInsight的大括号自动缩进
使用Source Insight可以很好的管理项目代码,也非常便于阅读.但是,在使用Source Insight书写C语言代码时,会发现这样的问题,键入大括号之后,它会自动缩进一个制表符,这种处理跟我 ...
- initrd.img的压缩(制作)及解压的过程
一.启动镜像initrd.img 文件类RedHat 系统从vmlinuz 核心引导后,会读取initrd.img 启动镜像.该文件中包含驱动模块等信息,是非常重要的文件.不同版本使用的格式不同.1. ...
- Linux——网络配置及命令
traceroute命令(unix)/tracert命令(windows) tracert命令的格式为:tracert [-d] [-h maximum_hops] [-j host-list] [- ...
- xaml可扩展应用程序标记语言
xaml 类似于 html,但不是html,它是基于xml语言的:’html可以呈现在浏览器中而xaml 可以现实 3d动画等特效. xaml 是强类型语言, 是解释性语言,虽然他可以被编译.
- linux中的信号简介和trap命令
1.信号 linux通过信号来在运行在系统上的进程之间通信,也可以通过信号来控制shell脚本的运行 主要有一下信号 1 ##进程重新加载配置 2 ##删除进程在内存中的数据 3 ##删除鼠标在内存中 ...
- JavaScript右下角信息提示插件Notyf
在线演示 本地下载
- python——动态类型简介
动态类型简介 类型属于对象,而不是变量 每一个对象都有两个标准的头部信息:类型标志符和引用计数器. 对象的垃圾收集,就是通过引用计数器实现的.可以在脚本中任意使用对象而不需要考虑释放内存空间. 循环饮 ...
- Spring_使用外部属性文件
beans-properties.xml <?xml version="1.0" encoding="UTF-8"?><beans xmlns ...
- Extracting info from VCF files
R, Bioconductor filterVcf: Extract Variants of Interest from a Large VCF File (Paul Shannon) We demo ...