@wangjialin
2016-04-18T18:22:45.000000Z
字数 4714
阅读 886
读书总结
Modernizr是一个开源JavaScript库,用法和功能如下:
<script src="文件本地地址></script>
以便在文档呈现之前传建好html5元素点击查看HTML5标签
更加语义化的标签(Internet Explorer 9+, Firefox, Opera, Chrome 以及 Safari 支持以下标签):
<artical>, <aside>, <footer>, <header>, <section>, <nav>, <source>, <time>, <figcaption>, <figure>, <mark>, <embed>, <progress>
除了上面的,还有很多HTML5标签,下面从实例出发,了解下其中的canvas:
根据路径绘图~画一个小盒子
首先,明确canvas本质就是一个画布,在python里面有类似的用法,所以我们先来熟悉一下用canvas标签来画一个简单的小方块------点击查看demo
核心代码如下:
function draw() {
var canvas = document.getElementById("draw-in-me");
if (canvas.getContext) {
var ctx = canvas.getContext("2d");
ctx.beginPath();
ctx.moveTo(120.0, 32.0);
//三次贝塞尔曲线
ctx.bezierCurveTo(120.0, 36.4, 116.4, 40.0, 112.0, 40.0);
ctx.lineTo(8.0, 40.0);
ctx.bezierCurveTo(3.6, 40.0, 0.0, 36.4, 0.0, 32.0);
ctx.lineTo(0.0, 8.0);
ctx.bezierCurveTo(0.0, 3.6, 3.6, 0.0, 8.0, 0.0);
ctx.lineTo(112.0, 0.0);
ctx.bezierCurveTo(116.4, 0.0, 120.0, 3.6, 120.0, 8.0);
ctx.lineTo(120.0, 32.0);
ctx.closePath(); //关闭此次绘制
ctx.fill(); //默认填充黑色
ctx.lineWidth = 2.0;
ctx.strokeStyle = "rgb(255, 255, 255)"; //路径颜色
ctx.stroke(); //实际绘制路径
}
}
原理很简单,canvas是一块有着横纵坐标的画布,左上角为原点,越往右x越大,越往下y越大,变量ctx引用的是画布的绘图空间(二维),简单的根据矢量作图就是在一个二维平面上面确定几个点,连线作为绘图经过的路径,这里中间对绘图结果做了一个边角的处理,可以参考三次贝塞尔曲线是什么, 用js计算三次贝塞尔曲线
根据位图绘图~处理灰度图片
这个例子是将一个彩色图片用canvas处理成灰度版,并用 onmouseover 以及 onmouseout 来进行彩色版和灰度版本的切换,点击查看demo------demo;
核心代码如下:
function convertToGS(img) {
//存储原始彩色版
img.color = img.src;
//创建灰度版
img.grayscale = createGSCanvas(img);
//在onmouseover时候发生切换
img.onmouseover = function() {
this.src = this.color;
}
img.onmouseout = function() {
this.src = this.grayscale;
}
img.onmouseout();
}
function createGSCanvas(img) {
var canvas = document.createElement("canvas");
canvas.width = img.width;
canvas.height = img.height;
var ctx = canvas.getContext("2d");
//将图片绘制入画布
ctx.drawImage(img, 0, 0);
//getImageData只能操作和脚本处于同一个域中的图片
var c = ctx.getImageData(0, 0, img.width, img.height);
//按照像素修改图片的颜色
for (var i = 0; i < c.height; i++) {
for (var j = 0; j < c.width; j++) {
var x = (i * c.width + j) * 4;
var r = c.data[x];
var g = c.data[x + 1];
var b = c.data[x + 2];
c.data[x] = c.data[x + 1] = c.data[x + 2] = (r+g+b)/3;
}
}
ctx.putImageData(c, 0, 0, 0, 0, c.width, c.height);
return canvas.toDataURL();
}
//添加load事件,如果有其他脚本,换用addEventLoad函数比较好
window.onload = function() {
convertToGS(document.getElementById("cute"));
}
原理:首先创建切换函数,鼠标悬停(onmouseover)时图片为彩色版,离开(onmouseout)时图片为灰度版;接着完成构建灰度图片的函数,简单讲先把图片写入画布(ctx.drawImage(img, 0, 0)),然后读出图片的每一个像素,然后将该像素的rgb颜色变为(r+g+b)/3后修改图片参数(ctx.putImageData),这样在鼠标悬停时为原本的彩色,离开时调用这个函数将图片处理成灰度版。原理应该是很好理解的,但是具体操作的时候会遇到几个问题:
我在本地编辑后在chrome浏览器下打开,开发者工具下在第24行getImageData出现了一个图片跨域的错误:11-2.html:37 Uncaught SecurityError: Failed to execute 'getImageData' on 'CanvasRenderingContext2D': The canvas has been tainted by cross-origin data.
关于像素遍历的理解:
<?php
$pic = 'http://avatar.csdn.net/7/5/0/1_molaifeng.jpg';
$arr = getimagesize($pic);
$pic = "data:{$arr['mime']};base64," . base64_encode(file_get_contents($pic));
?>
<img src="<?php echo $pic ?>" />
var uimageObj = new Image();
UimageObj.crossOrigin = 'anonymous'; // crossOrigin attribute has to be set before setting src.If reversed, it wont work.
UimageObj.src = obj_data.srcUser;