【第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
繁體地址,請注明出處:http://hk.pswp.cn/news/907520.shtml
英文地址,請注明出處:http://en.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