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. 函数封装

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

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

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

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

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

getPxInfo(imgData, 99, 99);

3. 函数封装

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

图片马赛克处理 案例

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8" />
    5. <title></title>
    6.  
    7. <link rel="stylesheet" type="text/css" href="./css/index.css" />
    8.  
    9. <script type="text/javascript" src="./js/kjfFunctions.js"></script>
    10. <script type="text/javascript" src="./js/index.js"></script>
    11.  
    12. <style type="text/css">
    13. body {
    14. width: 100%;
    15. color: #000;
    16. background: #96b377;
    17. font: 14px Helvetica, Arial, sans-serif;
    18. }
    19.  
    20. #wrap {
    21. display: flex;
    22. flex-direction: column;
    23. justify-content: center;
    24. align-items: center;
    25. }
    26. </style>
    27. </head>
    28.  
    29. <body>
    30.  
    31. <div id="wrap"></div>
    32.  
    33. <!-- javascript 代码 -->
    34. <script type="text/javascript">
    35. // 创建 画布的width 画布的height 背景颜色 父元素
    36. function createCanvasTo(canvasWidth, canvasHeight, bgColor, parentObj){
    37. var myCanvas = document.createElement("canvas");
    38. myCanvas.width = canvasWidth;
    39. myCanvas.height = canvasHeight;
    40. myCanvas.innerText = " 您的浏览器不支持 canvas,建议更新或者更换浏览器。";
    41. if(bgColor){
    42. myCanvas.style.backgroundColor = bgColor;
    43. };
    44. if(parentObj){
    45. parentObj.appendChild(myCanvas);
    46. };
    47.  
    48. return myCanvas;
    49. };
    50.  
    51. var wrap = document.getElementById("wrap");
    52. var myCanvas = createCanvasTo(1040, 480, "#eee", wrap);
    53.  
    54. // 获取画笔
    55. var pen = myCanvas.getContext("2d");
    56. pen.fillStyle = 'olive'; // 填充的颜色
    57. pen.strokeStyle = "blue"; // 笔的颜色
    58. pen.lineWidth = 4; // 笔宽
    59. pen.lineCap = "round"; // 圆形结束
    60. pen.lineJoin = "round"; // 圆角
    61.  
    62. // 开始绘制
    63. var imgObj = new Image();
    64. imgObj.src = "./img/Nick.jpg";
    65. imgObj.onload = function(){
    66. pen.drawImage(imgObj, 0, 0, 520, 480);
    67.  
    68. var imgData = pen.getImageData(0,0,520,480);
    69.  
    70. size = 5;
    71. var i = 0,
    72. j = 0,
    73. a = 0,
    74. b = 0;
    75. for(i=0; i<imgData.width; i++){
    76. for(j=0; j<imgData.height; j++){
    77. var colorPoint = getColorPos( imgData,
    78. Math.floor(i*size+Math.random()*size),
    79. Math.floor(j*size+Math.random()*size));
    80. for(a=0; a<size; a++){
    81. for(b=0; b<size; b++){
    82. setColorPos(imgData, i*size+a, j*size+b, colorPoint);
    83. };
    84. };
    85. };
    86. };
    87. pen.putImageData(imgData, 520, 0);
    88. };
    89.  
    90. function getColorPos(imgArr, x, y){
    91. var rgba = [];
    92. rgba[0] = imgArr.data[(imgArr.width*y+x)*4+0];
    93. rgba[1] = imgArr.data[(imgArr.width*y+x)*4+1];
    94. rgba[2] = imgArr.data[(imgArr.width*y+x)*4+2];
    95. rgba[3] = imgArr.data[(imgArr.width*y+x)*4+3];
    96. return rgba;
    97. };
    98. function setColorPos(imgArr, x, y, rgba){
    99. imgArr.data[(imgArr.width*y+x)*4+0] = rgba[0];
    100. imgArr.data[(imgArr.width*y+x)*4+1] = rgba[1];
    101. imgArr.data[(imgArr.width*y+x)*4+2] = rgba[2];
    102. imgArr.data[(imgArr.width*y+x)*4+3] = rgba[3];
    103. };
    104. </script>
    105. </body>
    106. </html>

图片反相处理

    1. <!DOCTYPE html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8" />
    5. <title>图片反相</title>
    6.  
    7. <style type="text/css">
    8. body {
    9. width: 100%;
    10. color: #000;
    11. background: #96b377;
    12. font: 14px Helvetica, Arial, sans-serif;
    13. }
    14.  
    15. #wrap {
    16. display: flex;
    17. flex-direction: column;
    18. justify-content: center;
    19. align-items: center;
    20. }
    21. </style>
    22. </head>
    23.  
    24. <body>
    25.  
    26. <div id="wrap"></div>
    27.  
    28. <!-- javascript 代码 -->
    29. <script type="text/javascript">
    30. // 创建 画布的width 画布的height 背景颜色 父元素
    31. function createCanvasTo(canvasWidth, canvasHeight, bgColor, parentObj){
    32. var myCanvas = document.createElement("canvas");
    33. myCanvas.width = canvasWidth;
    34. myCanvas.height = canvasHeight;
    35. myCanvas.innerText = " 您的浏览器不支持 canvas,建议更新或者更换浏览器。";
    36. if(bgColor){
    37. myCanvas.style.backgroundColor = bgColor;
    38. };
    39. if(parentObj){
    40. parentObj.appendChild(myCanvas);
    41. };
    42.  
    43. return myCanvas;
    44. };
    45.  
    46. var wrap = document.getElementById("wrap");
    47. var myCanvas = createCanvasTo(520*3, 480, "#eee", wrap);
    48.  
    49. var imgObj = new Image();
    50. imgObj.src = "./img/Nick.jpg";
    51. imgObj.onload = function(){
    52. var pen = myCanvas.getContext("2d");
    53. pen.drawImage(imgObj, 0, 0, 520, 480);
    54. pen.drawImage(imgObj, 520, 0, 520, 480);
    55.  
    56. var pxObj = pen.getImageData(520+100, 100, 100, 160);
    57. setColorInversion(pxObj);
    58. pen.putImageData(pxObj, 520+100, 100);
    59.  
    60. pxObj = pen.getImageData(0, 0, 520, 480);
    61. setColorInversion(pxObj);
    62. pen.putImageData(pxObj, 520*2, 0);
    63. };
    64.  
    65. function setColorInversion(pxObj){
    66. var i = 0;
    67. var j = 0;
    68. for(i=0; i<pxObj.width; i++){
    69. for(j=0; j<pxObj.height; j++){
    70. pxObj.data[(pxObj.width*j+i)*4+0] = 255 - pxObj.data[(pxObj.width*j+i)*4+0];
    71. pxObj.data[(pxObj.width*j+i)*4+1] = 255 - pxObj.data[(pxObj.width*j+i)*4+1];
    72. pxObj.data[(pxObj.width*j+i)*4+2] = 255 - pxObj.data[(pxObj.width*j+i)*4+2];
    73. pxObj.data[(pxObj.width*j+i)*4+3] = 150;
    74. };
    75. };
    76. };
    77. </script>
    78. </body>
    79. </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. Mathematica 求出解后代入变量

    Solve[2 x - 3 == 0, x] x = x //. %[[1]]

  2. Android App性能测试之二:CPU、流量

    CPU---监控值的获取方法.脚本实现和数据分析 1.获取CPU状态数据 adb shell dumpsys cpuinfo | findstr packagename 自动化测试脚本见cpustat ...

  3. 对评分矩阵进行分解,SVD与LSI

    摘自 推荐系统 https://www.cnblogs.com/lzllovesyl/p/5243370.html 一.SVD奇异值分解 1.SVD简介 SVD(singular value deco ...

  4. js打印WEB页面内容代码大全

    第一种方法:指定不打印区域 使用CSS,定义一个.noprint的class,将不打印的内容放入这个class内. 详细如下: <style media=print type="tex ...

  5. Python中应该使用%还是format来格式化字符串?

    转载自http://www.cnblogs.com/liwenzhou/p/8570701.html %的特点是,前面有几个%,后面的括号里就得有几个参数,如果只有一个%,括号可以省略 基本格式 'a ...

  6. MYSQL实战

    基础架构 更新操作 日志模块 redo log 和 binlog 两阶段提交: prepare commit 事务隔离 读未提交:别人改数据的事务尚未提交,我在我的事务中也能读到.读已提交:别人改数据 ...

  7. 重新定义Pytorch中的TensorDataset,可实现transforms

    class TensorsDataset(torch.utils.data.Dataset): ''' A simple loading dataset - loads the tensor that ...

  8. Linker errors in Android NDK (undefined reference to `__cxa_end_cleanup')

    在 Android 中移植一个库(该库 使用了 libstlport )时 产生如下错误: ./obj/local/armeabi/objs/jniWrapper/native.o: In funct ...

  9. 【原创】大叔经验分享(23)spark sql插入表时的文件个数研究

    spark sql执行insert overwrite table时,写到新表或者新分区的文件个数,有可能是200个,也有可能是任意个,为什么会有这种差别? 首先看一下spark sql执行inser ...

  10. 利用BootStrap Table插件实现自己的弹出框分页。

    参考链接1:    官网:http://bootstrap-table.wenzhixin.net.cn/zh-cn/home/        开始使用:http://bootstrap-table. ...