当前位置: 首页 > 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)
}

http://www.xdnf.cn/news/706663.html

相关文章:

  • 纯前端实现图片伪3D视差效果
  • 华为OD机试真题——告警抑制(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
  • Embedded IDE下载及调试
  • PHP在2025:Web开发领域的常青树与进化之路
  • Selenium基础操作方法详解
  • 分布式CAP理论
  • 拉取gitlab项目
  • mac电脑安装nvm
  • C# 事件的选择与使用
  • 命令模式,观察者模式,状态模式,享元模式
  • 同为.net/C#的跨平台运行时的mono和.net Core有什么区别?
  • Android开发常用Kotlin高级语法
  • 已解决:.NetCore控制台程序(WebAPI)假死,程序挂起接口不通
  • Java求职面试:从Spring到微服务的技术挑战
  • 【.net core】Rotativa 如何在linux上实现
  • 分布式数据库备份实践
  • 50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | Split Landing Page(拆分展示页)
  • CSS篇-1
  • dis css port brief 命令详细解释
  • Windows MongoDB C++驱动安装
  • idea本地git上传gitee码云失败分析,push rejected+git手动融合
  • 工程化架构设计:Monorepo 实战与现代化前端工程体系构建
  • 从零开始创建 Vue 3 开发环境并构建第一个 Demo
  • 前端-关于apk文件分片上传
  • 代码随想录算法训练营 Day59 图论Ⅸ dijkstra优化版 bellman_ford
  • 基于URL弹窗的图片链接生成功能技术实现
  • 快速了解 GO 之依赖注入与 mock测试
  • [Go] Option选项设计模式 — — 编程方式基础入门
  • 驱动开发(2)|鲁班猫rk3568简单GPIO波形操控
  • 2025年数字经济与绿色金融国际会议:智能金融与可持续发展的创新之路