IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> canvas(七) ImageData 像素操作(灰度化、马赛克) -> 正文阅读

[JavaScript知识库]canvas(七) ImageData 像素操作(灰度化、马赛克)

ImageData

  • ImageData 是图片的数据化,它具备以下属性:
    • data:Uint8ClampedArray [r,g,b,a, r,g,b,a, r,g,b,a, r,g,b,a......]
    • width:整数
    • heidth:整数

注:Uint8ClampedArray 翻译过来是 8位无符号整型固定数组,其取值范围是[0,255]。若小于0,则为0,大于255,则为255。若为小数,则取整,取整的方法是银行家舍入。

  • data:Uint8ClampedArray [0,1,2,3, 4,5,6,7,8,9,10,11,12,13,14,15]
    在这里插入图片描述

建立ImageData()

直接建立ImageData() 对象(相当于自己新建了一张图片)。

  • new ImageData()
    • new ImageData(width, height) , 相当于一张空白图片
    • new ImageData(Uint8ClampedArray, width, height)
  • ctx.createImageData()
    ctx.createImageData(width, height)
    ctx.createImageData(ImageData)

获取canvas 的ImageData() 对象(可以以此原理获取真实图片的数据)

  • ctx.getImageData(x, y, width, height)

在canvas 中显示ImageData

  • putImageData(ImageData, dx, dy, x, y, w, h)

获取ImageData

  • ctx.getImageData(0,0,width,height);
const canvas=document.getElementById('canvas');
//canvas充满窗口
canvas.width=window.innerWidth;
canvas.height=window.innerHeight;
const ctx=canvas.getContext('2d');
const img=new Image();
img.src='./images/dog.jpg';
img.onload=function(){
    //获取图片宽高
    const {width,height}=img;
    /*1.在canvas 中绘制图像*/
    ctx.drawImage(img,0,0);
    /*2.从canvas 中获取图像的ImageData*/
    const imgData=ctx.getImageData(0,0,width,height);
    /*3.在canvas 中显示ImageData*/
    ctx.putImageData(
        imgData,
        //位置
        0,height,
        //裁剪
        150,150,
        100,100
    )
};

像素遍历

逐像素遍历

  • 每隔4 个数据遍历一次,简单快捷
for(let i=0;i<arr.length;i+=4){
        let r=data[i+0];
        let g=data[i+1];
        let b=data[i+2];
        let a=data[i+3];
        console.log(r,g,b,a)
}

行列遍历

for(let y=0;y<h;y++){
     for(let x=0;x<w;x++){
          let ind=(y*w+x)*4;
          let r=data[ind];
          let g=data[ind+1];
          let b=data[ind+2];
          let a=data[ind+3];
          console.log(r,g,b,a)
   }
}

图像灰度化

  • 灰度算法 const lm =0.299*r + 0.587*g + 0.114*b ;
   const canvas=document.getElementById('canvas');
    //canvas充满窗口
    canvas.width=window.innerWidth;
    canvas.height=window.innerHeight;
    const ctx=canvas.getContext('2d');
    const img=new Image();
    img.src='./images/river.jpg';
    img.onload=draw;
    /*灰度算法: 0.299*r+0.587*g+0.114*b */
    function draw(){
        //图像尺寸
        const {width,height}=img;
        /*1.在canvas 中绘制图像*/
        ctx.drawImage(img,0,0);
        /*2.从canvas 中获取图像的ImageData*/
        const imgDt=ctx.getImageData(0,0,width,height);
        const data=imgDt.data;
        console.log(data);
        /*像素遍历*/
        for(let i=0;i<data.length;i+=4){
            const [r,g,b]=[
                data[i],
                data[i+1],
                data[i+2],
            ]
            const lm=0.299*r+0.587*g+0.114*b;
            data[i]=lm;
            data[i+1]=lm;
            data[i+2]=lm;
            // console.log(lm);
        }
        /*3.在canvas 中显示ImageData*/
        ctx.putImageData(imgDt,0,height);
  }

图像马赛克

  • 获取一区域的像素颜色,然后将此颜色赋给此区域的所有像素。
const canvas=document.getElementById('canvas');
//canvas充满窗口
canvas.width=window.innerWidth;
canvas.height=window.innerHeight;
const ctx=canvas.getContext('2d');
//图像源
const img=new Image();
img.src='./images/wns.jpg';
img.onload=render;
//色块尺寸
let size=5;
function render() {
    //图像尺寸
    const {width,height}=img;
    /*1.在canvas 中绘制图像*/
    ctx.drawImage(img,0,0);
    /*2.从canvas 中获取图像的ImageData*/
    const imgDt=ctx.getImageData(0,0,width,height);
    const data=imgDt.data;
    /*行列遍历*/
    for(let y=0;y<height;y+=size){
        for(let x=0;x<width;x+=size){
            const i=(y*width+x)*4;
            const [r,g,b]=[
                data[i],
                data[i+1],
                data[i+2],
            ]
            ctx.fillStyle=`rgb(${r},${g},${b})`;
            ctx.fillRect(x,y,size,size);
        }
    }
}
  • const i=(y*width+x)*4;的原理如下:
  • 画布的 w=2, h=2 ,data=[0,1,2,3, 4,5,6,7,8,9,10,11,12,13,14,15]
  • 求:data 中求r 的索引位置ind,由公式 ind=(y*w+x)*4 得:
y , x
0 , 0  -  (0*2+0)*4 = 0
0 , 1  -  (0*2+1)*4 = 4
1 , 0  -  (1*2+0)*4 = 8
1 , 1  -  (y*w+x)*4 =
  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-01-16 12:57:45  更:2022-01-16 12:58:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 12:27:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码