canvas 像素操作

像素,即像素点,一个像素只有一个颜色

100*100 的 px 的屏幕区域有 100*100*4 个像素点,即 width*height*4

rgba(0, 0, 0, 1);    在 css 中透明的范围为 0-1

rgba(0, 0, 0, 255);    在 canvas 中透明的范围也为 0-255

读取空白画布的像素点,为黑色透明色 (0, 0, 0, 0)____即使画布设置颜色为 red

所以,一般读取 绘画 的像素点

  • 读取已有像素,改写后再绘制

// 1. 读取矩形像素信息    参数1,参数2    矩形左上角坐标

var imgData = pen.getImageData(100, 100, 100, 100);    参数3,参数4    矩形的 width 和 height

// 2. 改变像素

for(var i=0; i<imgData.data.length; i++){

imgData.data[4*i+0] = 144;

imgData.data[4*i+1] = 144;

imgData.data[4*i+2] = 144;

imgData.data[4*i+3] = 144;

}

// 3. 将改变的像素数组,绘制带画布 (100, 100) 区域

pen.putImageData(imgData, 100, 100);    

  • 自建一个像素数据数据,改写后绘制

// 1. 创建像素对象    返回的像素数组,也是黑色透明色 (0, 0, 0, 0);

var imgData = pen.createImagData(100, 100);

// 2. 改变像素信息

for(var i=0; i<imgData.length; i++){

imgData.data[4*i+0] = 14;

imgData.data[4*i+1] = 164;

imgData.data[4*i+2] = 154;

imgData.data[4*i+3] = 255;

}

// 3. 写入已改变像素点 数组

pen.putImageData(imgData, 100, 100);

单个像素写入操作 (封装)

1. 获取画布所有像素点的信息

var imgData = pen.getImageData(0, 0, myCanvas.width, myCanvas.height);

2. 设置 (99, 99) 点 为 蓝色

setPxInfo(imgData, 99, 99, [0, 0, 255, 0]);

3. 函数封装

  • function setColorPos(imgArr, x, y, rgba){
    imgArr.data[(imgArr.width*y+x)*4+0] = rgba[0];
    imgArr.data[(imgArr.width*y+x)*4+1] = rgba[1];
    imgArr.data[(imgArr.width*y+x)*4+2] = rgba[2];
    imgArr.data[(imgArr.width*y+x)*4+3] = rgba[3];
    };

读取单个像素颜色操作 (封装)

1. 获取画布所有像素点的信息

var imgData = pen.getImageData(0, 0, myCanvas.width, myCanvas.height);

2. 设置 (99, 99) 点 为 蓝色

getPxInfo(imgData, 99, 99);

3. 函数封装

  • function getColorPos(imgArr, x, y){
    var rgba = [];
    rgba[0] = imgArr.data[(imgArr.width*y+x)*4+0];
    rgba[1] = imgArr.data[(imgArr.width*y+x)*4+1];
    rgba[2] = imgArr.data[(imgArr.width*y+x)*4+2];
    rgba[3] = imgArr.data[(imgArr.width*y+x)*4+3]; return rgba;
    };

图片马赛克处理 案例

  • <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8" />
    <title></title> <link rel="stylesheet" type="text/css" href="./css/index.css" /> <script type="text/javascript" src="./js/kjfFunctions.js"></script>
    <script type="text/javascript" src="./js/index.js"></script> <style type="text/css">
    body {
    width: 100%;
    color: #000;
    background: #96b377;
    font: 14px Helvetica, Arial, sans-serif;
    } #wrap {
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
    }
    </style>
    </head> <body> <div id="wrap"></div> <!-- javascript 代码 -->
    <script type="text/javascript">
    // 创建 画布的width 画布的height 背景颜色 父元素
    function createCanvasTo(canvasWidth, canvasHeight, bgColor, parentObj){
    var myCanvas = document.createElement("canvas");
    myCanvas.width = canvasWidth;
    myCanvas.height = canvasHeight;
    myCanvas.innerText = " 您的浏览器不支持 canvas,建议更新或者更换浏览器。";
    if(bgColor){
    myCanvas.style.backgroundColor = bgColor;
    };
    if(parentObj){
    parentObj.appendChild(myCanvas);
    }; return myCanvas;
    }; var wrap = document.getElementById("wrap");
    var myCanvas = createCanvasTo(1040, 480, "#eee", wrap); // 获取画笔
    var pen = myCanvas.getContext("2d");
    pen.fillStyle = 'olive'; // 填充的颜色
    pen.strokeStyle = "blue"; // 笔的颜色
    pen.lineWidth = 4; // 笔宽
    pen.lineCap = "round"; // 圆形结束
    pen.lineJoin = "round"; // 圆角 // 开始绘制
    var imgObj = new Image();
    imgObj.src = "./img/Nick.jpg";
    imgObj.onload = function(){
    pen.drawImage(imgObj, 0, 0, 520, 480); var imgData = pen.getImageData(0,0,520,480); size = 5;
    var i = 0,
    j = 0,
    a = 0,
    b = 0;
    for(i=0; i<imgData.width; i++){
    for(j=0; j<imgData.height; j++){
    var colorPoint = getColorPos( imgData,
    Math.floor(i*size+Math.random()*size),
    Math.floor(j*size+Math.random()*size)); for(a=0; a<size; a++){
    for(b=0; b<size; b++){
    setColorPos(imgData, i*size+a, j*size+
    b, colorPoint);
    };
    };

    };
    };
    pen.putImageData(imgData, 520, 0);
    }; function getColorPos(imgArr, x, y){
    var rgba = [];
    rgba[0] = imgArr.data[(imgArr.width*y+x)*4+0];
    rgba[1] = imgArr.data[(imgArr.width*y+x)*4+1];
    rgba[2] = imgArr.data[(imgArr.width*y+x)*4+2];
    rgba[3] = imgArr.data[(imgArr.width*y+x)*4+3]; return rgba;
    }; function setColorPos(imgArr, x, y, rgba){
    imgArr.data[(imgArr.width*y+x)*4+0] = rgba[0];
    imgArr.data[(imgArr.width*y+x)*4+1] = rgba[1];
    imgArr.data[(imgArr.width*y+x)*4+2] = rgba[2];
    imgArr.data[(imgArr.width*y+x)*4+3] = rgba[3];
    };
    </script>
    </body>
    </html>

图片反相处理

  • <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8" />
    <title>图片反相</title> <style type="text/css">
    body {
    width: 100%;
    color: #000;
    background: #96b377;
    font: 14px Helvetica, Arial, sans-serif;
    } #wrap {
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
    }
    </style>
    </head> <body> <div id="wrap"></div> <!-- javascript 代码 -->
    <script type="text/javascript">
    // 创建 画布的width 画布的height 背景颜色 父元素
    function createCanvasTo(canvasWidth, canvasHeight, bgColor, parentObj){
    var myCanvas = document.createElement("canvas");
    myCanvas.width = canvasWidth;
    myCanvas.height = canvasHeight;
    myCanvas.innerText = " 您的浏览器不支持 canvas,建议更新或者更换浏览器。";
    if(bgColor){
    myCanvas.style.backgroundColor = bgColor;
    };
    if(parentObj){
    parentObj.appendChild(myCanvas);
    }; return myCanvas;
    }; var wrap = document.getElementById("wrap");
    var myCanvas = createCanvasTo(520*3, 480, "#eee", wrap); var imgObj = new Image();
    imgObj.src = "./img/Nick.jpg";
    imgObj.onload = function(){
    var pen = myCanvas.getContext("2d");
    pen.drawImage(imgObj, 0, 0, 520, 480);
    pen.drawImage(imgObj, 520, 0, 520, 480); var pxObj = pen.getImageData(520+100, 100, 100, 160);
    setColorInversion(pxObj);
    pen.putImageData(pxObj, 520+100, 100); pxObj = pen.getImageData(0, 0, 520, 480);
    setColorInversion(pxObj);
    pen.putImageData(pxObj, 520*2, 0);
    }; function setColorInversion(pxObj){
    var i = 0;
    var j = 0;
    for(i=0; i<pxObj.width; i++){
    for(j=0; j<pxObj.height; j++){
    pxObj.data[(pxObj.width*j+i)*4+0] = 255 - pxObj.data[(pxObj.width*j+i)*4+0];
    pxObj.data[(pxObj.width*j+i)*4+1] = 255 - pxObj.data[(pxObj.width*j+i)*4+1];
    pxObj.data[(pxObj.width*j+i)*4+2] = 255 - pxObj.data[(pxObj.width*j+i)*4+2];
    pxObj.data[(pxObj.width*j+i)*4+3] = 150;
    };
    };
    };
    </script>
    </body>
    </html>

HTML5_canvas_像素操作_图片马赛克_图片反相的更多相关文章

  1. HTML5_canvas_图片加载_双缓冲_跳帧闪烁问题

    canvas 图片加载 pen.drawImage(ele, showX, showY, imgWidth, imgHeight); ele    将 img 元素 加载到画布上 步骤 1. 创建一个 ...

  2. CLOSE-UP FORMALWEAR_意大利进口_2015秋冬_男装发布会_西装图片系列_男装西装设计资料_WeArTrends时尚资讯网_国内最专业的服装设计资讯网站

    CLOSE-UP FORMALWEAR_意大利进口_2015秋冬_男装发布会_西装图片系列_男装西装设计资料_WeArTrends时尚资讯网_国内最专业的服装设计资讯网站 CLOSE-UP FORMA ...

  3. PHP图片裁剪_图片缩放_PHP生成缩略图

    在制作网页过程中,为了排版整齐美观,对网页中的图片处理成固定大小尺寸的图片,或是要截去图片边角中含有水印的图片,对于图片量多,每天更新大量图,靠人工PS处理是不现实的,那么有没有自动处理图片的程序了! ...

  4. 基于HTML5 Canvas实现的图片马赛克模糊特效

    效果请点击下面网址: http://hovertree.com/texiao/html5/1.htm 一.开门见山受美国肖像画家Chuck Close的启发,此脚本通过使用HTML5 canvas元素 ...

  5. 2.4.5 用NPOI操作EXCEL--插入图片

    我们知道,在Excel中是可以插入图片的.操作菜单是“插入->图片”,然后选择要插入图片,可以很容易地在Excel插入图片.同样,在NPOI中,利用代码也可以实现同样的效果.在NPOI中插入图片 ...

  6. JAVA之旅(二十六)——装饰设计模式,继承和装饰的区别,LineNumberReader,自定义LineNumberReader,字节流读取操作,I/O复制图片

    JAVA之旅(二十六)--装饰设计模式,继承和装饰的区别,LineNumberReader,自定义LineNumberReader,字节流读取操作,I/O复制图片 一.装饰设计模式 其实我们自定义re ...

  7. PPT导出图片质量太差?简单操作直接导出印刷质地图片

    PPT导出图片质量太差?简单操作直接导出印刷质地图片    ​ PPT不仅可以用于展示文档,还可以用于简单图片合成处理,同时,PPT文档还可以全部导出为图片. 默认情况下,PPT导出的图片为96DPI ...

  8. Java学习笔记——IO操作之以图片地址下载图片

    以图片地址下载图片 读取给定图片文件的内容,用FileInputStream public static byte[] mReaderPicture(String filePath) { byte[] ...

  9. Spring_MVC_教程_快速入门_深入分析

    Spring MVC 教程,快速入门,深入分析 博客分类: SPRING Spring MVC 教程快速入门  资源下载: Spring_MVC_教程_快速入门_深入分析V1.1.pdf Spring ...

随机推荐

  1. Entity Framework入门教程(15)---DbContext追踪实体状态改变

    这一节介绍DbContext追踪实体的变化.EF支持DbContext在其生命周期中自动追踪加载的实体.我们可以通过DbChangeTracker类获取DbContext追踪的所有实体的变化. 注意每 ...

  2. Java CAS 比较并且更换值

    原文:Java中CAS详解 作者:jayxu无捷之径 在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁 锁机制存在以下问题: (1)在多线程竞争下,加锁.释放锁会 ...

  3. .net使用Aspose.Words进行Word替换操作的实现代码

    DLL文件下载 示例: Aspose.Words.Document doc = new Aspose.Words.Document(TempFile); Aspose.Words.DocumentBu ...

  4. Windows 下 exe 服务注册到 service 服务中

    window 下注册 exe 程序.添加到 服务中. window 注册服务方式 一. regsvr 方式 直接在 程序目录执行: Regsvr 32 命令是Windows中控件文件 ( 如扩展名为D ...

  5. JavaSE笔记-集合

    Java集合大致可分为:List,Set,Map,Queue List:有序,可重复 Set:无序(输出和插入顺序不一定一致),不可重复 Map:映射关系,根据key去访问value Queue:队列 ...

  6. CF1139C Edgy Trees

    题目地址:CF1139C Edgy Trees 红黑树 \(ans\) 应该等于总数(\(n^k\))减去不含黑色边的序列数量 不含黑色边就意味着一个序列只能在一个红色联通块中 一个红色联通块中的序列 ...

  7. Eclipse编译运行没问题,但执行mvn clean install跑单元测试失败的原因解析

    问题描述:mvn clean install编译工程并运行单元测试出现如下错误 Tests run: 3, Failures: 0, Errors: 2, Skipped: 0, Time elaps ...

  8. 肺结节CT影像特征提取(四)——肺结节CT影像特征提取MATLAB代码实现

    之前的文章讲述了肺结节CT影像数据特征提取算法及基于MATLAB GUI设计的肺结节CT影像特征提取系统.本文将讲述几个主要部分的代码实现,分别是预处理.灰度特征提取.纹理特征提取.形态特征提取数据. ...

  9. k64 datasheet学习笔记22---Direct Memory Access Controller (eDMA)

    0.前言 本文主要介绍DMA相关内容 1.简介 DMA模块包含: 1.一个DMA引擎 源和目的地址的计算 数据搬移 2.本地存储的传输控制描述TCD,对于16个传输通道中的每一个各对应一个TCD 1. ...

  10. Java开发之@PostConstruct和@PreDestroy注解

    从Java EE5规范开始,Servlet增加了两个影响Servlet生命周期的注解(Annotation):@PostConstruct和@PreConstruct.这两个注解被用来修饰一个非静态的 ...