Day 23 - 影像处理篇 - 影像与色彩 - 成为Canvas Ninja ~ 理解2D渲染的精髓

老实说我决定要写影像处理这个部分的时候还蛮犹豫的,因为在javascript 做影像处理的这个领域,IT邦之前其实就有蛮多写的蛮不错的文章。

例如第11届铁人赛 , lb01910483大大写的 用 Javascript 当个影像魔术师

不过既然都决定要写了,那我也只能尽力去把这个章节写完XD

话不多说,就让我们开始吧。

canvas的影像处理基础

大家不知道还有没有印象我们在前些时候有讲过canvas的像素操作(pixel manipulation)。

我们之前有讲过canvasimageData的提取方法,也有提到过最一个基本的像素处理案例实作:『拼字图画』。

相信之前有读过我们的像素操作教学文的人应该已经对我们接下来要讲的东西都有了一些基本的概念~

没读过或不熟的同学可以再回去读一读喔~之前的文连结在这边: https://ithelp.ithome.com.tw/articles/10270233

我们在这一篇会先来简单的热个身! 从一些简单的影像处理技术,还有简单的色彩原理开始讲解 ~

简易影像处理技术实作一 : 彩色转灰阶

其实这个技巧我们在像素处理那篇有用过,但是当时并没有很清楚地提出来讲~

彩色转灰阶的原理其实很简单,就是单纯的把RGB channel 的值取平均

就像下面这样:

function turnImageDataIntoGrayscale(imageData){
   let data = imageData.data;
   for(let i=0;i<data.length;i = i+4){
     let r = data[i];
     let g = data[i+1];
     let b = data[i+2];
     //取得rgb值得平均, 如此一来因为rgb都变成同一个数值
     // 图像就会变成灰阶图
     let average = (r+g+b)/3
     data[i] = data[i+1] = data[i+2] = average;
   }
  return imageData;
}

可能有些人会有点纳闷,为什麽取平均就会变成灰阶图呢? 其实可以稍微回忆一下每次在写css要用灰阶色时,灰阶系列的颜色基本都是rgb为相同数值的组合(例如#333 就是rgb(51,51,51))~

简易影像处理技术实作二 : 反相

反相顾名思义就是把色相(Hue)颠倒过来,而实作的方式很简单,就是直接用255去扣掉当前的channel值就可以了

function invertImageData(imageData){
   let data = imageData.data;
   for(let i=0;i<data.length;i = i+4){
     let r = data[i];
     let g = data[i+1];
     let b = data[i+2];

    //直接用255去扣掉当前的channel值
     data[i] = 255 - r;
     data[i+1] = 255 - g;
     data[i+2] = 255 - b;
     
   }
  return imageData;
}

在上面两个案例中,也就是灰阶化反相,他们其实都是对色相(Hue)彩度(Chroma)明度(Value)的一种操作。

色相(Hue)彩度(Chroma)明度(Value)美术领域色彩学中并称『色彩三要素』,意思是说只要透过调节这三种要素的数值/占比,就可以产生任意颜色。

而在电脑编程的世界中,我们平常在写样式的时候通常是用到HEX色码或者是RGB(A)制的颜色,但是其实还有另外两种我们比较不常用到的格式,那就是HSVHSL,这两者的HS代表的都是Hue(色相)Saturate(饱和度)HSVVValue(明度),而HSLL则是亮度(Ligntness)

  • Hue(色相) : 基本上跟色彩学 - 色彩三要素色相(Hue)无异。
  • Saturate(饱和度): 跟色彩学 - 色彩三要素彩度(Chroma)有直接关系,但是不是等价,除此之外HSLHSVS计算方式略有不同。
  • Value(明度): 跟色彩学 - 色彩三要素明度(Value)有直接关系,但是不是等价。
  • 亮度(Ligntness): 虽然名称不同,跟色彩学 - 色彩三要素明度(Value)反而比较接近。

img

图片来自 维基百科

从上图我们可以看出HSL制HSV制的差别主要就在於表示色彩亮度的Z轴部分(HSL会随着L值的增加而变得更趋近於白色,但是HSV不会)

RGB与HSL/HSV 的相互转换方法 可以读这篇 : https://www.itread01.com/content/1549753775.html

到这边我们就做完基本的热身了 ~ 下一篇开始我们会实作一些比较有趣的案例,还是老样子各位敬请期待 :D


<<:  #23 No-code 之旅 — Next.js 网站可以部署到哪里呢?

>>:  [Day 23] - React 取得永丰汇率api的json资料(1)

#26 JS: HTML DOM Events - Part 4(Start Over Version)

After understanding the basic HTML DOM Event conce...

[Day 14] 实作-页面选单 v-menu v-btn

今天来做选单啦 先来看一下 Vuetify 提供的 Menus组件,他这个比较适合选单复杂的程序, ...

【零基础成为 AI 解梦大师秘笈】Day28 - 周易解梦之人工智慧(9)

人工智慧9 前言 系列文章简介 大家好,我们是 AI . FREE Team - 人工智慧自由团队,...

我想成为架构师-计划蓝图

继上次废话之後,此次话不多说!正入主题!! 此次我给自己安排计画能将会一笔一笔列出,也就是我未来将循...

不要再用print来debug 了 ...

笔者相信有非常多的朋友很爱用print 列印相关的讯息来当作除错讯息的参考使用,类似下面的做法 笔者...