zoukankan      html  css  js  c++  java
  • HTML5 Canvas 获取网页的像素值。

    我之前在网上看过一个插件叫做出JScolor   颜色拾取器  说白了就是通过1*1PX的DOM设置颜色值通过JS来获取当前鼠标点击位置DOM的颜色值。

    自从HTML5 画布出来之后。就有更好的方法来获取了,比方郭阿里巴巴ICON矢量库 用的SVG和渐变来进行绘制:


    我昨天用Canvas来绘制了一下。由于Canvas有现成的方法getImageData(x,y,width,height);这种方法返回一个属性data数组,也就是CanvasPixelArray

    1个像素分别有四个值rgba(红,绿,蓝,阿尔法值); 1个像素就有这4个值,意味着CanvasPixelArray里面每一个像素值就占了个位置简称4X(下同)。

    CanvasPixelArray的排序要简单,从左上角到右下角。长度也简单4X。比方说width*height*4.比方:3*3像素CanvasPixelArray有多少个值。3*3*4=36值。

    有一点说明一下。关系到我们以下说的:像素值是从1開始。

    可是数组的索引值是从0開始的。所以我们刚刚说的3*3像素CanvasPixelArray长度是36位。

    可是第3*3像素它的颜色值 是[....,32,33,34,35]。索引值 须要减去4開始。道理就是像素開始的坐标是1*1.可是数组是0。

    第3*3像素位置的下标開始Star和结束end我们能够脑袋想想就出来。可是假设第542*245像素的值我们怎么算。当然了。假设你是天才脑袋的话。我以下的

    算法能够无视:

    下面算法的借鉴来自于程序出版之家:图灵程序设置的《HTML5 Canvas教程》。

    像素值:rgba在CanvasPixelArray里面的排序也是红(r),跟着是绿(g),蓝(b),阿尔法(a);依据这个规律。我也仅仅要得到红(r),然后再以此+1,+2,+3(来获取剩下的值)

    而恰好红(r)是目标像素再CanvasPixelArray的stat位置。

    也就是我们要获取開始的位置。剩下的就OK了。

    比方是我们要获取上面542*245的值。

    var width=imagedates.width;
    var x=542;
    var y=245;
    var r=(y-1)*(width*4)+(x*4)-4);
    y-1上面说过了。数组的下标是0開始的。width*4获取了1行在CanvasPixelArray有多少个像素值.*(y-1)得到了在y行第一列的像素值開始下标。以下是列了542了

    (x*4)-4得到了到了距离第一列之前有多少位像素值的长度。然后相加。就到了目标像素的事实上位置 红色(r)

    红色出来了。其它的就更加简单了。s

    g=r+1;

    b=r+2;

    a=r+3;

    /*************算法非常easy。关键是要又一次划分鼠标下标以及像素開始的坐标**********/

    通过上面的我们就能够做一个颜色拾取器了:

    (function(){
        var c=document.getElementById("MyCanvas"),
            ctx=c.getContext("2d"),
            image=new Image();
            image.src="1.png";
        image.onload=function(){
            ctx.drawImage(this,0,0);
        }   
        c.onclick=function(e){
        var x=e.clientX,y=e.clientY,x1=this.offsetLeft,y1=this.offsetTop,nowx=x-x1,nowy=y-y1;
             var imagedates=ctx.getImageData(nowx,nowy,1,1);
             var pixel=imagedates.data;
             document.getElementById("color").style["background-color"]="rgb("+pixel[0]+","+pixel[1]+","+pixel[2]+")";
         }
    })()
    有一点须要注意的是image.src须要和文件同源。这样才干有效执行以下的代码。不然会报错的。此外以上代码须要在server环境执行。本地測试data会返回[0,0,0,0];

  • 相关阅读:
    (双指针 二分) leetcode 167. Two Sum II
    (双指针) leetcode 485. Max Consecutive Ones
    (双指针) leetcode 27. Remove Element
    (String) leetcode 67. Add Binary
    (数组) leetcode 66. Plus One
    (N叉树 BFS) leetcode429. N-ary Tree Level Order Traversal
    (N叉树 递归) leetcode 590. N-ary Tree Postorder Traversal
    (N叉树 递归) leetcode589. N-ary Tree Preorder Traversal
    (N叉树 DFS 递归 BFS) leetcode 559. Maximum Depth of N-ary Tree
    (BST 递归) leetcode98. Validate Binary Search Tree
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/7064496.html
Copyright © 2011-2022 走看看