【第4章 图像与视频】4.5 操作图像的像素

文章目录

  • 前言
  • 示例-获取和修改图像数据
  • 图像数据的遍历方式
  • 图像滤镜
    • 负片滤镜
    • 黑白滤镜
    • 浮雕滤镜
    • filter滤镜属性


前言

getImageData() 与 putImageData() 这两个方法分别用来获取图像的像素信息,以及向图像中插入像素。与此同时,如果有需要,也可以修改像素的值,所以说,这两个方法能够让开发展对图像之中的像素进行任何可以想见的操作。

属性描述
width返回 ImageData 对象的宽度
height返回 ImageData 对象的高度
data返回一个对象,其包含指定的 ImageData 对象的图像数据
方法描述
createImageData()创建新的、空白的 ImageData 对象
getImageData()返回 ImageData 对象,该对象为画布上指定的矩形复制像素数据
putImageData()把图像数据(从指定的 ImageData 对象)放回画布上

示例-获取和修改图像数据

使用getImageData()方法获取imagedata数据源,然后仅中心100*100区域替换原始Canvas。

在这里插入图片描述

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>4-9-putImageData使用示例</title><style>html,body {margin: 0;padding: 0;}</style></head><body><canvas id="canvas" width="300" height="200"> canvas not supports </canvas><script>// 尺寸const width = 300,height = 200// 目标Canvas上下文const canvas = document.getElementById('canvas'),context = canvas.getContext('2d')// 目标图片const image1 = new Image()image1.src = './3.jpg'image1.onload = () => {context.drawImage(image1, 0, 0, width, height)}// 覆盖图片const image2 = new Image()image2.src = './2.jpg'image2.onload = function () {// 获取覆盖图数据const dirtyCanvas = document.createElement('canvas'),dirtyContext = dirtyCanvas.getContext('2d')// 设置屏幕外Canvas尺寸dirtyCanvas.width = widthdirtyCanvas.height = height// 绘制替换图dirtyContext.drawImage(this, 0, 0, width, height)// 此时可以得到imagedata数据const imagedata = dirtyContext.getImageData(0, 0, width, height)// console.log(imagedata)// 然后中间100*100区域替换目标Canvascontext.putImageData(imagedata, 0, 0, 100, 50, 100, 100)}</script></body>
</html>

图像数据的遍历方式

// 遍历每个像素
for (let i = 0; i < length, ++i) {value = data[i]
}// 反向遍历每个像素
index = length - 1
while (index > = 0) {value = data[index]index--
}// 只处理 alpha 值,不修改红、绿、蓝分量
for(let index=3; index < length - 4; index+=4) {data[index] = ... // Alpha
}// 只处理红、绿、蓝分量,不修改 alpha 值
for(let index=0; index < length - 4; index+=4) {data[index] = ... // Reddata[index + 1] = ... // Greendata[index + 2] = ... // Blue
}

图像滤镜

原始图片:
在这里插入图片描述

负片滤镜

负片滤镜会从 255 之中减去每个像素的红、绿、蓝分量值,再将差值设置回去,这样也就等于“反转”了该像素的颜色。

在这里插入图片描述

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>4-13-负片滤镜</title><style>#canvas {background: rgba(0, 0, 0, 0.4);}</style></head><body><div id="controls">负片滤镜<input type="checkbox" id="negativeCheckbox" /></div><canvas id="canvas" width="1000" height="600"> canvas not supports </canvas><script>const canvas = document.getElementById('canvas'),context = canvas.getContext('2d'),negativeCheckbox = document.getElementById('negativeCheckbox')const image = new Image()image.src = './waterfall.png'image.onload = () => {context.drawImage(image, 0, 0, canvas.width, canvas.height)}negativeCheckbox.onchange = (e) => {const imagedata = context.getImageData(0, 0, canvas.width, canvas.height),data = imagedata.datafor (let i = 0; i < data.length - 4; i += 4) {data[i] = 255 - data[i]data[i + 1] = 255 - data[i + 1]data[i + 2] = 255 - data[i + 2]}context.putImageData(imagedata, 0, 0)}</script></body>
</html>

黑白滤镜

黑白滤镜会计算出每个像素红、绿、蓝分量值的平均值,然后将三个分量都设置为这一均值,于是,就把图像由彩色变成了黑白。

在这里插入图片描述

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>4-14-黑白滤镜</title><style>#canvas {background: rgba(0, 0, 0, 0.4);}</style></head><body><div id="controls">黑白滤镜<input type="checkbox" id="drawInColorToggleChebox" /></div><canvas id="canvas" width="1000" height="600"> canvas not supports </canvas><script>const canvas = document.getElementById('canvas'),context = canvas.getContext('2d'),drawInColorToggleChebox = document.getElementById('drawInColorToggleChebox')function drawInColor() {context.drawImage(image, 0, 0, canvas.width, canvas.height)}function drawInBlackAndWhite() {const imagedata = context.getImageData(0, 0, canvas.width, canvas.height),data = imagedata.datafor (let i = 0; i < data.length - 4; i += 4) {average = (data[i] + data[i + 1] + data[i + 2]) / 3data[i] = averagedata[i + 1] = averagedata[i + 2] = average}context.putImageData(imagedata, 0, 0)}const image = new Image()image.src = './waterfall.png'image.onload = () => {drawInColor()}drawInColorToggleChebox.onchange = (e) => {if (e.target.checked) {drawInBlackAndWhite()} else {drawInColor()}}</script></body>
</html>

浮雕滤镜

在这里插入图片描述

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>4-14-浮雕滤镜</title><style>#canvas {background: rgba(0, 0, 0, 0.4);}</style></head><body><div id="controls">浮雕滤镜<input type="checkbox" id="embossCheckbox" /></div><canvas id="canvas" width="1000" height="600"> canvas not supports </canvas><script>const canvas = document.getElementById('canvas'),context = canvas.getContext('2d'),embossCheckbox = document.getElementById('embossCheckbox')function drawOriginalImage() {context.drawImage(image, 0, 0, canvas.width, canvas.height)}function drawEmbossImage() {let iamgedata, data, length, widthiamgedata = context.getImageData(0, 0, canvas.width, canvas.height)data = iamgedata.datalength = data.lengthwidth = iamgedata.widthindex = 3for (let i = 0; i < length; i++) {if ((i + 1) % 4 !== 0) {data[i] = 255 / 2 + 2 * data[i] - data[i + 4] - data[i + width * 4]}}context.putImageData(iamgedata, 0, 0)}const image = new Image()image.src = './waterfall.png'image.onload = () => {drawOriginalImage()}embossCheckbox.onchange = (e) => {if (e.target.checked) {drawEmbossImage()} else {drawOriginalImage()}}</script></body>
</html>

filter滤镜属性

Canvas 2D API 的 CanvasRenderingContext2D.filter 属性是用来提供模糊、灰度等滤镜效果。它类似于 CSS filter 属性,并且接受相同的值。

具体说明见 MDN-filter 或 Canvas API中文网

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/907520.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Docker 从入门到实战全攻略(一):核心概念 + 命令详解 + 部署案例】

1. 是什么 Docker 是一个用于开发、部署和运行应用程序的开源平台&#xff0c;它使用 容器化技术 将应用及其依赖打包成独立的容器&#xff0c;确保应用在不同环境中一致运行。 2. Docker与虚拟机 2.1 Docker&#xff08;容器化&#xff09; 容器化是一种轻量级的虚拟化技术…

Vue:axios(POST请求)

发送 POST 请求 基本用法 axios.post(/api/login, {username: lcyyyy,password: 123456 }) .then(response > {console.log(请求成功:, response.data); }) .catch(error > {console.error(请求失败:, error); });在 Vue 组件中使用 export default {methods: {async …

一周学会Pandas2之Python数据处理与分析-数据重塑与透视-unstack() - 解堆 (行 -> 列)

锋哥原创的Pandas2 Python数据处理与分析 视频教程&#xff1a; 2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili unstack() 是 pandas 中用于数据重塑的重要方法&#xff0c;它与 stack() 互为逆操作。unstack() 的主要功能是将行索…

基于大模型预测的FicatIII-IV期股骨头坏死综合治疗研究报告

目录 一、引言 1.1 研究背景与目的 1.2 国内外研究现状 1.3 研究意义和创新点 二、FicatIII-IV 期股骨头坏死概述 2.1 疾病定义与分期 2.2 病因与病理机制 2.3 临床症状与诊断方法 三、大模型预测原理与方法 3.1 大模型简介 3.2 数据收集与预处理 3.3 模型训练与优…

C++?多态!!!

一、引言 众所周知&#xff0c;C有三大特性&#xff0c;它们分别是封装、继承和多态&#xff0c;在之前的文章中已经详细介绍过封装和继承了&#xff0c;今天我们将一起学习多态相关的知识&#xff0c;如果还想了解封装、继承相关的知识&#xff0c;可以跳转到以下链接&#xf…

electron安装报错处理

electron安装报错 解决方法&#xff1a; 修改 C:\Users\用户名.npmrc下配置文件 添加代码 electron_mirrorhttps://cdn.npmmirror.com/binaries/electron/ electron_builder_binaries_mirrorhttps://npmmirror.com/mirrors/electron-builder-binaries/最后代码 registryhtt…

Windows10下使用QEMU安装Ubuntu20.04虚拟机,并启用硬件加速

Windows10下使用QEMU安装Ubuntu20.04虚拟机&#xff0c;并启用硬件加速 作者将狼才鲸创建日期2025-05-30 CSDN阅读地址&#xff1a;Windows10下使用QEMU安装Ubuntu20.04虚拟机&#xff0c;并启用硬件加速 本文档源码地址&#xff1a;Windows10下使用QEMU安装Ubuntu20.04虚拟机…

顶刊SCS | 基于视觉语言大模型推理分割的建筑足迹尺度功能分类, 样本数据和代码已开源!

论文介绍 题目&#xff1a;Visual-language reasoning segmentation (LARSE) of function-level building footprint across Yangtze River Economic Belt of China 期刊&#xff1a;Sustainable cities and society&#xff08;中科院一区TOP&#xff0c;IF10.5&#xff09;…

【软件】navicat 官方免费版

Navicat Premium Lite https://www.navicat.com.cn/download/navicat-premium-lite

每个路由器接口,都必须分配所属网络内的 IP 地址,用于转发数据包

在IP网络中&#xff0c;主机&#xff08;Host&#xff09;和路由器接口&#xff08;Router Interface&#xff09;都需要分配网络地址&#xff08;IP地址&#xff09;。 1. 主机&#xff08;Host&#xff09;的IP地址分配 (1) 作用 主机的IP地址用于唯一标识该设备&#xff0…

鸿蒙OSUniApp页面切换动效实战:打造流畅精致的转场体验#三方框架 #Uniapp

UniApp页面切换动效实战&#xff1a;打造流畅精致的转场体验 引言 在移动应用开发中&#xff0c;页面切换动效不仅能提升用户体验&#xff0c;还能传达应用的品质感。随着HarmonyOS的普及&#xff0c;用户对应用的动效体验要求越来越高。本文将深入探讨如何在UniApp中实现流畅…

Tesseract OCR 安装与中文+英文识别实现

一、下载 https://digi.bib.uni-mannheim.de/tesseract/ 下载&#xff0c;尽量选择时间靠前的&#xff08;识别更好些&#xff09;。符合你的运行机&#xff08;我的是windows64&#xff09; 持续点击下一步安装&#xff0c;安装你认可的路径即可&#xff0c;没必要配置环境变…

Visual Studio 2022 发布独立的 exe 文件

我们在用 Visual Studio 2022 写好一个 exe 程序之后&#xff0c;如果想把这个拿到其他地方运行&#xff0c;需要把 exe 所在的文件夹一起拿过去。 编译出来的 exe 文件需要其他几个文件一同放在同一目录才能运行&#xff0c;原因在于默认情况下&#xff0c;Visual Studio 是把…

Kotlin-特殊类型

文章目录 数据类型枚举类型匿名类和伴生对象单例类伴生对象 数据类型 声明一个数据类非常简单: //在class前面添加data关键字表示为一个数据类 data class Student(var name: String, var age: Int)数据类声明后,编译器会根据主构造函数中声明的所有属性自动为其生成以下函数…

在线博客系统【测试报告】

&#x1f552; 一. 项目背景 由于纸质笔记容易丢失&#xff0c;携带不变&#xff0c;为了方便自己学习的过程中记录笔记&#xff0c;特开发了这个博客系统。这个系统后端采用 SpringBoot MyBatis SpringMVC &#xff1b;前端使用Html CSS JS&#xff1b;数据库使用的是Mysq…

每日刷题c++

快速幂 #include <iostream> using namespace std; #define int long long int power(int a, int b, int p) {int ans 1;while (b){if (b % 2){ans * a;ans % p; // 随时取模}a * a;a % p; // 随时取模b / 2;}return ans; } signed main() {int a, b, p;cin >> a …

Python中的变量、赋值及函数的参数传递概要

Python中的变量、赋值及函数的参数传递概要 python中的变量、赋值 python中的变量不是盒子。 python中的变量无法用“变量是盒子”做解释。图说明了在 Python 中为什么不能使用盒子比喻&#xff0c;而便利贴则指出了变量的正确工作方式。 如果把变量想象为盒子&#xff0c;那…

KVM 安装 Ubuntu 22

在 KVM 中安装 Ubuntu 22 虚拟机。 首先创建硬盘文件 sudo qemu-img create -f qcow2 /app/vms/ubuntu22.qcow2 100G安装Ubuntu 22 sudo virt-install \--name ubuntu22 \--ram 4096 \--vcpus 2 \--disk path/app/vms/ubuntu22.qcow2,formatqcow2 \--os-type linux \--os-va…

基于生产-消费模式,使用Channel进行文件传输(Tcp方式)

Client端&#xff1a; #region 多文件传输 public class FileMetadata {public string FileName { get; set; }public long FileSize { get; set; } }class Program {const int PORT 8888;const int BUFFER_SIZE 60 * 1024 * 1024;//15s-50 25s-64 33s-32 27s-50 31s-40 25…

【后端高阶面经:Elasticsearch篇】39、Elasticsearch 查询性能优化:分页、冷热分离与 JVM 调优

一、索引设计优化:构建高效查询的基石 (一)分片与副本的黄金配置 1. 分片数量计算模型 # 分片数计算公式(单分片建议30-50GB) def calculate_shards(total_data_gb, single_shard_gb=30):return max