我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何使用canvas处理图像

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何使用canvas处理图像

如何使用canvas处理图像?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

canvas 的图像处理能力通过 ImageData 对象来处理像素数据。主要的 API 如下:

  • createImageData():创建一个空白的 ImageData 对象

  • getImageData():获取画布像素数据,每一个像素点有 4 个值 —— rgba

  • putImageData():将像素数据写入画布

imageData = {  width: Number,  height: Number,  data: Uint8ClampedArray}

width 是 canvas 画布的宽或者说 x 轴的像素数量;height 是画布的高或者说 y 轴的像素数量;data 是画布的像素数据数组,总长度 w * h * 4,每 4 个值(rgba)代表一个像素。

对图片的处理

下面,我们通过几个例子来看下 canvas 基础的图片处理能力。

原图效果:

如何使用canvas处理图像

const cvs = document.getElementById("canvas");const ctx = cvs.getContext("2d");const img = new Image();img.class="lazy" data-src="图片 URL";img.onload = function () {  ctx.drawImage(img, 0, 0, w, h);}

底片/负片效果

算法:将 255 与像素点的 rgb 的差,作为当前值。

function negative(x) {  let y = 255 - x;  return y;}

效果图:

如何使用canvas处理图像

const imageData =  ctx.getImageData(0, 0, w, h);const { data } = imageData;let l = data.length;for(let i = 0; i < l; i+=4) {  const r = data[i];  const g = data[i + 1];  const b = data[i + 2];  data[i] = negative(r);  data[i + 1] = negative(g);  data[i + 2] = negative(b);}ctx.putImageData(imageData, 0, 0);

单色效果

单色效果就是保留当前像素的 rgb 3个值中的一个,去除其他色值。

for(let i = 0; i < l; i+=4) { // 去除了 r 、g 的值  data[i] = 0;  data[i + 1] = 0;}

效果图:

如何使用canvas处理图像 

灰度图

灰度图:每个像素只有一个色值的图像。0 到 255 的色值,颜色由黑变白。

for(let i = 0; i < l; i+=4) {  const r = data[i];  const g = data[i + 1];  const b = data[i + 2];  const gray = grayFn(r, g, b);  data[i] = gray;  data[i + 1] = gray;  data[i + 2] = gray;}

算法1&mdash;&mdash;平均法:

const gray = (r + g + b) / 3;

效果图:

如何使用canvas处理图像 

算法2&mdash;&mdash;人眼感知:根据人眼对红绿蓝三色的感知程度:绿 > 红 > 蓝,给定权重划分

const gray = r * 0.3 + g * 0.59 + b * 0.11

效果图:

如何使用canvas处理图像

除此以外,还有:

取最大值或最小值。

const grayMax = Math.max(r, g, b); // 值偏大,较亮const grayMin = Math.min(r, g, b); // 值偏小,较暗

取单一通道,即 rgb 3个值中的一个。

 二值图

算法:确定一个色值,比较当前的 rgb 值,大于这个值显示黑色,否则显示白色。

for(let i = 0; i < l; i+=4) {  const r = data[i];  const g = data[i + 1];  const b = data[i + 2];  const gray = gray1(r, g, b);  const binary = gray > 126 ? 255 : 0;  data[i] = binary;  data[i + 1] = binary;  data[i + 2] = binary;}

效果图:

如何使用canvas处理图像 

高斯模糊

高斯模糊是“模糊”算法中的一种,每个像素的值都是周围相邻像素值的加权平均。原始像素的值有最大的高斯分布值(有最大的权重),相邻像素随着距离原始像素越来越远,权重也越来越小。

一阶公式:

如何使用canvas处理图像

(使用一阶公式是因为一阶公式的算法比较简单)

const radius = 5; // 模糊半径const weightMatrix = generateWeightMatrix(radius); // 权重矩阵for(let y = 0; y < h; y++) {  for(let x = 0; x < w; x++) {    let [r, g, b] = [0, 0, 0];    let sum = 0;    let k = (y * w + x) * 4;    for(let i = -radius; i <= radius; i++) {      let x1 = x + i;      if(x1 >= 0 && x1 < w) {      let j = (y * w + x1) * 4;      r += data[j] * weightMatrix[i + radius];      g += data[j + 1] * weightMatrix[i + radius];      b += data[j + 2] * weightMatrix[i + radius];      sum += weightMatrix[i + radius];      }    }    data[k] = r / sum;    data[k + 1] = g / sum;    data[k + 2] = b / sum;  }}for(let x = 0; x < w; x++) {  for(let y = 0; y < h; y++) {    let [r, g, b] = [0, 0, 0];    let sum = 0;    let k = (y * w + x) * 4;    for(let i = -radius; i <= radius; i++) {      let y1 = y + i;      if(y1 >= 0 && y1 < h) {        let j = (y1 * w + x) * 4;        r += data[j] * weightMatrix[i + radius];        g += data[j + 1] * weightMatrix[i + radius];        b += data[j + 2] * weightMatrix[i + radius];        sum += weightMatrix[i + radius];      }    }    data[k] = r / sum;    data[k + 1] = g / sum;    data[k + 2] = b / sum;  }}function generateWeightMatrix(radius = 1, sigma) { // sigma 正态分布的标准偏差  const a = 1 / (Math.sqrt(2 * Math.PI) * sigma);  const b = - 1 / (2 * Math.pow(sigma, 2));  let weight, weightSum = 0, weightMatrix = [];  for (let i = -radius; i <= radius; i++){    weight = a * Math.exp(b * Math.pow(i, 2));    weightMatrix.push(weight);    weightSum += weight;  }  return weightMatrix.map(item => item / weightSum); // 归一处理}

效果图:

如何使用canvas处理图像 

其他效果

这里再简单介绍下其他的图像效果处理,因为例子简单重复,所以不再给出代码和效果图。

  • 亮度调整:将 rgb 值,分别加上一个给定值。

  • 透明化处理:改变 rgba 值中的 a 值。

  • 对比度增强:将 rgb 值分别乘以 2,然后再减去一个给定值。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网行业资讯频道,感谢您对编程网的支持。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何使用canvas处理图像

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何使用canvas处理图像

如何使用canvas处理图像?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。canvas 的图像处理能力通过 ImageData 对象来处理像素数据。主要的 AP
2023-06-09

如何在HTML5 中使用canvas进行图像处理

本篇文章为大家展示了如何在HTML5 中使用canvas进行图像处理,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。卷积什么是卷积?就跳过一些用专业属于描述专业术语看完懵逼的解释了,语文成绩很差的我尝
2023-06-09

如何使用 PHP 处理图像?

php 图像处理指南提供了从 jpeg/png 文件创建图像资源、复制/调整大小/翻转图像的常用函数。实战案例说明了如何缩放上传的图像为缩略图。高级功能包括图像滤镜、文本水印和编辑操作(裁剪/旋转/翻转)。用 PHP 处理图片的完整指南P
如何使用 PHP 处理图像?
2024-04-20

PHP 如何使用图像处理函数?

php 提供图像处理函数,用于编辑图像,包括:调整尺寸:使用 imagecreatefromjpeg() 和 imagecopyresampled()裁剪:imagecrop()旋转:imagerotate()水印:imagealphabl
PHP 如何使用图像处理函数?
2024-04-19

Opencv图像处理中如何使用mask

这篇文章将为大家详细讲解有关Opencv图像处理中如何使用mask,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。图像基本运算图像的基本运算有很多种,比如两幅图像可以相加、相减、相乘、相除、位运算、平方根、
2023-06-14

Python图像处理库PIL如何使用

这篇文章主要介绍“Python图像处理库PIL如何使用”,在日常操作中,相信很多人在Python图像处理库PIL如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python图像处理库PIL如何使用”的疑
2023-07-06

如何使用 PHP 内置函数处理图像?

php 内置函数提供了便捷的图像处理功能,可实现图像缩放、裁剪、添加水印等操作。使用 imagecopyresampled() 可缩放图像,imagecrop() 可裁剪图像,而 imagecopymerge() 用于添加水印。如何使用 P
如何使用 PHP 内置函数处理图像?
2024-04-22

详解如何使用OpenCV和像素处理图像灰度化

这篇文章主要为大家介绍了如何使用OpenCV和像素处理图像灰度化的方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-05-17

Canvas像素处理之如何改变透明度

这篇文章给大家分享的是有关Canvas像素处理之如何改变透明度的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一 定义和用法getImageData()方法返回 ImageData 对象,该对象拷贝了画布指定矩形的
2023-06-09

怎样使用Python图像处理

这篇文章给大家介绍怎样使用Python图像处理,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Python图像处理是一种简单易学,功能强大的解释型编程语言,它有简洁明了的语法,高效率的高层数据结构,能够简单而有效地实现面
2023-06-17

如何使用OpenCV与JVM实现矩阵处理图像

这篇文章给大家分享的是有关如何使用OpenCV与JVM实现矩阵处理图像的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。submat(int rowStart, int rowEnd, int colStart, i
2023-06-26

PHP中如何处理图像处理错误?

PHP中如何处理图像处理错误?图像处理在网页开发中非常常见,而处理图像时经常会遇到一些错误。这些错误包括文件不存在、文件不是图像文件、文件过大等等。在图像处理过程中,我们需要能够准确地捕获这些错误,并对其进行适当的处理。本文将介绍一些在PH
PHP中如何处理图像处理错误?
2023-12-09

python OpenCV图像直方图如何处理

这篇“python OpenCV图像直方图如何处理”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“python OpenCV图
2023-07-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录