当前位置: 首页 > news >正文

【第4章 图像与视频】4.6 结合剪辑区域来绘制图像

文章目录

  • 前言
  • 示例


前言

本节将综合运用图像处理、离屏 canvas 以及剪辑区域等技术实现墨镜效果。


示例

在这里插入图片描述

主线程代码:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>4-18-综合运用图像处理、离屏canvas以及剪辑区域等技术的墨镜效果演示</title><style>#canvas {background: rgba(0, 0, 0, 0.4);}</style></head><body><div id="controls">墨镜滤镜<input type="checkbox" id="sunglassCheckbox" /></div><canvas id="canvas" width="800" height="600"> canvas not supports </canvas><script>const canvas = document.getElementById('canvas'),context = canvas.getContext('2d'),sunglassCheckbox = document.getElementById('sunglassCheckbox'),offscreenCanvas = document.createElement('canvas'),offscreenContext = offscreenCanvas.getContext('2d'),sunglassFilter = new Worker('./sunglassFilter.js'),LENS_RADIUS = canvas.width / 5const image = new Image()offscreenCanvas.width = canvas.widthoffscreenCanvas.height = canvas.height// Functions......function drawOriginalImage() {context.drawImage(image, 0, 0, canvas.width, canvas.height)}// 绘制镜片function drawLenses(leftLensLocation, rightLensLocation) {context.save()context.beginPath()context.arc(leftLensLocation.x, leftLensLocation.y, LENS_RADIUS, 0, Math.PI * 2, false)context.stroke()moveTo(rightLensLocation.x, rightLensLocation.y)context.arc(rightLensLocation.x, rightLensLocation.y, LENS_RADIUS, 0, Math.PI * 2, false)context.stroke()context.clip()context.drawImage(offscreenCanvas, 0, 0, canvas.width, canvas.height)context.restore()}// 绘制镜线function drawWire(center) {context.beginPath()context.moveTo(center.x - LENS_RADIUS / 4, center.y - LENS_RADIUS / 2)context.quadraticCurveTo(center.x,center.y - LENS_RADIUS + 20,center.x + LENS_RADIUS / 4,center.y - LENS_RADIUS / 2)context.stroke()}function putSunglassesOn() {const imagedata = context.getImageData(0, 0, canvas.width, canvas.height),center = {x: canvas.width / 2,y: canvas.height / 2,},leftLensLocation = {x: center.x - LENS_RADIUS - 10,y: center.y,},rightLensLocation = {x: center.x + LENS_RADIUS + 10,y: center.y,}sunglassFilter.postMessage(imagedata)sunglassFilter.onmessage = (e) => {offscreenContext.putImageData(e.data, 0, 0)drawLenses(leftLensLocation, rightLensLocation)drawWire(center)}}// Event handlers......sunglassCheckbox.onchange = () => {if (sunglassCheckbox.checked) {putSunglassesOn()} else {drawOriginalImage()}}// Initialization......image.src = './waterfall.png'image.onload = () => {drawOriginalImage()}</script></body>
</html>

Worker线程代码:

self.onmessage = function (e) {const imagedata = e.data,data = imagedata.data,width = imagedata.width,length = data.lengthfor (let i = 0; i < length; ++i) {if ((i + 1) % 4 != 0) {if ((i + 4) % (width * 4) == 0) {data[i] = data[i - 4]data[i + 1] = data[i - 3]data[i + 2] = data[i - 2]data[i + 3] = data[i - 1]} else {data[i] = 2 * data[i] - data[i + 4] - 0.5 * data[i + 4]}}}self.postMessage(imagedata)
}

相关文章:

  • 语法糖介绍(C++ Python)
  • Yum配置第三方源与本地源详解
  • Java-代码段-http接口调用自身服务中的其他http接口(mock)-并建立socket连接发送和接收报文实例
  • 练习小项目9:打字效果文字展示(多段文字循环+删除+光标闪烁)
  • 嵌入式学习笔记 - freeRTOS同优先级任务时间片抢占的实现
  • 酒店管理破局:AI 引领智能化转型
  • hf-mirror断点续传下载权重
  • (6)-Fiddler抓包-Fiddler状态面板详解
  • Java面试:从Spring Boot到分布式系统的技术探讨
  • SCL语言两台电机正反转控制程序从选型、安装到调试全过程的详细步骤指南(下)
  • 目标检测预测框置信度(Confidence Score)计算方式
  • 一文清晰理解目标检测指标计算
  • 深入分析SD-WAN成本效益和ROI(投资回报率):真的能降低WAN成本吗?
  • Spring Boot+Activiti7入坑指南初阶版
  • HbuilderX设置禁止import 引入模块换行
  • HOW - 简历和求职面试宝典(七)
  • spring的多语言怎么实现?
  • [解决]在 Vue 3 使用 Vite 开发的项目中,放在 public 文件夹里的文件,在打包部署后出现 404 的问题
  • Linux `|` 管道符与 `grep` 命令深度解析与高阶应用指南
  • 国产化redis 替代产品tendis 安装
  • 河南专业网站建设公司哪家好/seo商学院
  • 标志设计英语/深圳百度seo哪家好
  • 手机网站建设规划书/汕头seo排名收费
  • 营销型网站建设是什么/网优工程师前景和待遇
  • 网站的mysql数据库放到服务器上服务器需要安装mysql吗?/百度云搜索引擎
  • 台州网站设计公司/2023年时政热点事件