Canvas图像与视频基础,离屏19

/*除了可以把图像绘制到canvas中,还可以把自身或其它canvas、视频的某一帧绘制到当前绘图环境中。
--1--有时两个canvas的相互绘制需要创建离屏canvas,离屏技术实际上是用空间换时间的一种技术
        创建离屏canvas元素,可以动态创建元素,也可以用网页中一个隐藏区域的元素
               offscreenCanvas = document.createElement('canvas'), offscreenContext = offscreenCanvas.getContext('2d'),
        设置离屏canvas的宽和高
        在离屏canvas中进行绘制
        把离屏canvas中的全部或一部分绘制到另一个canvas中
        
--2--图像的绘制存在安全问题,默认的情况下允许绘制不属于自己域的图像,但不能通过Canvas API保存或修改其它域中的图像。如果修改其它域的图像则会抛出安全异常,一些浏览器都招供了解决方法,比如:
        chrome:在命令行中指定:'--allow-file-access-from-files'参数来启动浏览器;
        firefox:通过调用netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
        
--3--在使用这些API时性能也是一个需要关注的方面,不同的编码其效率不太一样,有一个大致的参考网站:【http://jsperf.com】
        drawImage()的速度要优于putImageData();
*/

 
/**************************************************context.drawImage()方法有如下几种参数形式,图像的绘制不会考虑当前路径,但它会考虑alpha, 阴影,剪辑区域以及图像合成效果等效果*/
1、context.drawImage(img, dx, dy);//dx, dy指定图片与原点的距离
2、context.drawImage(img, dx, dy, dw, dh);//dw, dh指定在目标区域内绘制整张图片,起到了缩放的效果。如果尺寸小于canvas的大小则是缩小,如果大于canvas的大小,则起到了放大的效果,并且一部分图像会绘制在canvas外面,可以通过坐标平移起到背景滚动的效果
3、context.drawImage(img, sx, sy, sw, sh,dx, dy, dw, dh);//会将图像的整体或一部分绘制到canvas中,并在绘制时根据目标的宽度和高度进行缩放,前5个参数与图片有关,后4个参数与画布有关,即S源和D目录
//图片缩放后,永远居中的实现方法............................................
function drawScaled() {
   var w = canvas.width,
       h = canvas.height,
       sw = w * scale,
       sh = h * scale;

   context.drawImage(offscreenCanvas, 0, 0,
      offscreenCanvas.width, offscreenCanvas.height,
      -sw/2 + w/2, -sh/2 + h/2, sw, sh);
}

//最简单的例子
var img = new Image();
img.src = "countrypath.jpg";
img.onload = function(){
    context.drawImage(img, 10, 10, 1500, 1500);
}

/***************************************************context.getImageData()返回ImageData对象,它有以下三个属性:*/
    width:图像的宽度
    height:图像的高度
    data:包括各个像素值的数组,是一个数组,每4个整数值代表一个像素点RGBA,通过遍历数组,对不同的通道加以运算就可以做出不同的效果来,数组的总个数是4*width*height个,W3C规范现把data以ArrayBuffer来存放

context.getImageData(sx, sy, swidth, sheight);//这4个参数是必须的。指定了取得绘图区域的矩形大小


/***************************************************context.putImageData(),这个方法在绘制图像时不受一些全局参数的影响,而drawImage()则会受限制*/
context.putImageData(ImageData, dx, dy);//将ImageData绘制在canvas的[dx, dy]处
context.putImageData(ImageData, dx, dy, dirtyX, dirtyY, dirtyW, dirtyY);//后四个参数是可选的指定的是ImageData图像的属性,并不是canvas的属性,起到截取图像的作用,按一定比例设置后可以起到缩放的效果


context.createImageData();

/*下面是对ImageData数据的操作例子,实现了几个不同的滤镜功能,如果利用上述几种特殊滤镜结合setTimeout和setInterval来制作动画(不过效率太低,一般用.requestAnimationFrame()方法),制作时可以用离屏,设置总体的透明度,以及改变数据值:
  【1】负片滤镜:把原像素用255去减
  【2】黑白滤镜:算出三个像素的平均值,然后赋值给三个RGB
  【3】浮雕滤镜:相对复杂一些
  【4】墨镜滤镜:
*/
//负片滤镜
    var imageData = context.getImageData(0, 0, canvas.width, canvas.height);//这处注意应该是对象,它里面的data是一个指针,指向数据数组
    var data = imageData.data;

    for (var i=0; i<data.length; i+=4){
        data[i]= 255 - data[i];
        data[i+1]= 255 - data[i+1];
        data[i+2]= 255 - data[i+2];
    }
//浮雕滤镜
for (i=0; i < length; i++) { // loop through every pixel
      if (i <= length-width*4) {// if we won't overrun the bounds of the array
         if ((i+1) % 4 !== 0) {// if it's not an alpha
            // if it's the last pixel in the row, there is
            // no pixel to the right, so copy previous pixel's
            // values.

            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];
               i+=4;
            }
            else { // not the last pixel in the row
               data[i] = 255/2         // Average value
                         + 2*data[i]   // current pixel
                         - data[i+4]   // next pixel
                         - data[i+width*4]; // pixel underneath
            }
         }
      }
      else { // last row, no pixels underneath,
             // so copy pixel above
         if ((i+1) % 4 !== 0) {
            data[i] = data[i-width*4];
         }
      }
   }
   //   墨镜滤镜
   for (i=0; i < length; ++i) {
      if ((i+1) % 4 != 0) {   
         if ((i+4) % (width*4) == 0) { // last pixel in a row
            data[i] = data[i-4];
            data[i+1] = data[i-3];
            data[i+2] = data[i-2];
            data[i+3] = data[i-1];
            i+=4;
         }
         else {
           data[i] = 2*data[i] - data[i+4] - 0.5*data[i+4];
         }
      }
   }

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

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

相关文章

python黑马lambda匿名函数

1、区别 deflambda 有名称 可以重复使用 没有名称 不可以重复使用 2、lambda 传入参数&#xff1a;函数体&#xff08;一行代码&#xff09; # 传统函数方式 def square(x):return x**2print(square(5)) # 输出&#xff1a;25 # 使用lambda表达式 square_lambda lambda …

数字孪生系统的难点

数字孪生系统的开发和实施涉及一些技术难点&#xff0c;这些难点需要综合应用多个领域的知识和技术来克服。以下是一些数字孪生系统开发中的技术难点&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1…

【每日一题】4.LeetCode——杨辉三角

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;小杨水平有限&#xff0c;欢迎各位大佬指点&…

监听元素宽高变化---new ResizeObserver

参考&#xff1a;ResizeObserver API详解-CSDN博客 有的时候需要监听某个元素的宽高变化&#xff0c;这个时候可以使用JS的 resizeObserver 钩子函数。 用于监视元素的大小变化。它可以观察一个或多个 DOM 元素&#xff0c;以便在元素的大小或形状发生变化时触发回调函数。R…

openssl3.2/test/certs - 058 - no subjectAltNames excluded by CA2.

文章目录 openssl3.2/test/certs - 058 - no subjectAltNames excluded by CA2.概述笔记END openssl3.2/test/certs - 058 - no subjectAltNames excluded by CA2. 概述 openssl3.2 - 官方demo学习 - test - certs 笔记 /*! * \file D:\my_dev\my_local_git_prj\study\open…

安全用电管理平台方案介绍——Acrelcloud-6000

安全用电管理平台是一个针对电力系统安全管理的平台&#xff0c;旨在提供对电力设备和用电行为进行监控、分析和管理的解决方案。该平台结合了物联网技术、数据分析和远程监控等技术手段&#xff0c;能够实时监测、分析和预警电力系统的安全状况&#xff0c;以便及时采取措施防…

广州工业元宇宙赋能新型工业化,推动工业制造业数字化转型发展

随着科技的飞速发展&#xff0c;新型工业化的概念逐渐成为全球关注的焦点。在数字化转型的浪潮中&#xff0c;工业制造业的发展面临着巨大的机遇和挑战。广州作为中国南方的重要工业基地&#xff0c;积极探索工业元宇宙的赋能作用&#xff0c;以推动工业制造业的数字化转型发展…

Backend - Django URL 路由 重定向 url编码解码

目录 一、url 的 <> 作用 &#xff08;一&#xff09;操作流程 &#xff08;二&#xff09;前端设置链接 1. 包括&#xff1a; 2. 比如 &#xff08;三&#xff09;后端匹配路由 1. 理解 2. 比如 &#xff08;三&#xff09;后端视图的 get( )的参数 1. 理解 …

pip清华源怎么换回来

怎么临时使用清华源 pip install scrapy -i https://pypi.Python.org/simple/怎么永久换源 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple修改清华源后怎么换回来 删掉/home/XXX/.config/pip/pip.conf

openssl3.2/test/certs - 070 - Certs for CVE-2022-4203 testcase

文章目录 openssl3.2/test/certs - 070 - Certs for CVE-2022-4203 testcase概述笔记END openssl3.2/test/certs - 070 - Certs for CVE-2022-4203 testcase 概述 openssl3.2 - 官方demo学习 - test - certs 笔记 /*! * \file D:\my_dev\my_local_git_prj\study\openSSL\te…

[蓝桥学习] 前缀和与差分

前缀和原理 特点 求区间和 如果要实现一边修改一边查询&#xff0c;需要使用树状树组和线段树。 例题 题目很简单&#xff0c;但是代码实现惊艳到我了&#xff0c;是L就加1&#xff0c;是Q就减1&#xff0c;如果区间 [i,j] 是平衡子串的话&#xff0c;那它会在前缀prefix i …

我用Java开发了一个五子棋小游戏

java开发一个五子棋小游戏代码 import java.util.Scanner;public class Gomoku {private static final int BOARD_SIZE 15;private static final char EMPTY .;private static final char PLAYER1 X;private static final char PLAYER2 O;public static void main(String[…

基于Kubernetes(K8s)构建企业容器云基础运行环境

cncfstack 新 文章上线&#xff1a; 书名&#xff1a;《云原生解决方案》 地址&#xff1a;https://zhaowenyu.com/cncf-solution 访问&#xff1a;文章底部“阅读原文”或访问域名 云原生计算是云计算发展新的里程碑阶段&#xff0c;是当今与未来很长一段时间中 IT 发展的技…

【学网攻】 第(10)节 -- 路由器单臂路由配置

系列文章目录 目录 系列文章目录 文章目录 前言 一、单臂路由是什么&#xff1f; 二、实验 1.引入 实验拓扑图 PC配置 Sw配置 Router配置 实验验证 总结 文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交换机认识及使用【学网攻】 第(3)节 -- 交…

【医学图像隐私保护】PLAN方法:解决 GAN 生成医学图像 Latent 空间中的隐私保护

PLAN方法&#xff1a;解决 GAN 生成医学图像 Latent 空间中的隐私保护方法 PLAN 原理StyleGAN 生成视网膜图k-SALSA 生成视网膜图PLAN方法 生成视网膜图 总结 PLAN 原理 论文&#xff1a;https://arxiv.org/abs/2307.02984 代码&#xff1a;https://github.com/perceivelab/P…

Git 基本概念

Git是一种版本控制系统&#xff0c;用于跟踪文件的更改并协同开发代码。它具有以下基本概念和使用方式&#xff1a; 仓库&#xff08;Repository&#xff09;&#xff1a;Git将文件存储在仓库中&#xff0c;它是保存项目历史记录和更改的地方。一个项目通常有一个主要的仓库。 …

电商价格监测准确率如何保证

品牌做电商价格监测的前提是为了找出网络渠道中的破价链接&#xff0c;只有精准到筛选出破价链接&#xff0c;才能进行针对性的治理&#xff0c;比如经销渠道&#xff0c;只有当品牌拿出其破价的证据&#xff0c;才能对授权渠道进行规则管控&#xff0c;非授权渠道也是如此&…

HTML5与App封装技术将网站一键打包成App

HTML5&#xff1a;跨平台的利器HTML5作为一种先进的网页标记语言&#xff0c;其最大的优势在于跨平台性。开发者仅需编写一次代码&#xff0c;即可在各种操作系统和设备上运行&#xff0c;无需为每个平台单独开发App。这种“编写一次&#xff0c;运行处处”的模式&#xff0c;大…

java-集合-排序

集合的排序 java.util.Collections类 Collections是集合的工具类,里面定义了很多静态方法用于操作集合. java.util.Collections类是Java集合框架中的一个工具类&#xff0c;提供了一系列静态方法来操作集合对象。它包含了各种方法&#xff0c;如排序、查找、更改集合中的元素等…

系统架构15 - 软件工程(3)

软件过程模型 瀑布模型特点缺点 原型化模型特点两个阶段不同类型注意 螺旋模型V 模型特点 增量模型特点 喷泉模型基于构件的开发模型(CBSD)形式化方法模型敏捷模型特点“适应性” (adaptive) 而非“预设性” (predictive)“面向人的” (People-oriented) 而非“面向过程的” (P…