【项目笔记】:前端canvas截图功能

简介: canvasAPI、canvas音视频截图功能及注意事项

一.canvas简介

Canvas APIlink(画布)是在HTML5中新增的标签用于在网页实时生成图像,并且可以操作图像内容,基本上它是一个可以用JavaScript操作的位图(bitmap)。简单来说就是html5新增的画图工具。

二.canvas常用方法及属性

不管实现什么功能得先获取canvas画布的dom,在画布上实现功能,获取dom的那六种方式。这里就不说了获取画笔通过getContext()方法,语法:canvasDom.getContext('2D');

今天我们主要用的方法

canvas.toDataURL(mimeType, quality);

参数说明
mimeType(可选)String
mimeType表示需要转换的图像的mimeType类型。默认值是image/png,还可以是image/jpeg,甚至image/webp(前提浏览器支持)等。

quality(可选)Number
quality表示转换的图片质量。范围是01。此参数要想有效,图片的mimeType需要是image/jpeg或者image/webp,其他mimeType值无效。默认压缩质量是0.92根据自己的肉眼分辨,如果使用toDataURL()的quality参数对图片进行压缩,同样的压缩百分比呈现效果要比Adobe Photoshop差一些。

返回值
返回base64 data图片数据。

drawImage():在画布上绘制图像,canvas最常用的方法,没有之一。

语法
context.drawImage(image, dx, dy);
context.drawImage(image, dx, dy, dWidth, dHeight);
context.drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight);
参数
各个参数含义和作用如下:

image:Object
绘制在Canvas上的元素,可以是各类Canvas图片资源(见CanvasImageSource),如<img>图片,SVG图像,Canvas元素本身等。

dx:Number
在Canvas画布上规划一片区域用来放置图片,dx就是这片区域的左上角横坐标。

dy:Number
在Canvas画布上规划一片区域用来放置图片,dy就是这片区域的左上角纵坐标。

dWidth:Number
在Canvas画布上规划一片区域用来放置图片,dWidth就是这片区域的宽度。

dHeight:Number
在Canvas画布上规划一片区域用来放置图片,dHeight就是这片区域的高度。

sx:Number
表示图片元素绘制在Canvas画布上起始横坐标。

sy:Number
表示图片元素绘制在Canvas画布上起始纵坐标。

sWidth:Number
表示图片元素从坐标点开始算,多大的宽度内容绘制Canvas画布上。

sHeight:Number
表示图片元素从坐标点开始算,多大的高度内容绘制Canvas画布上。

三.截图代码

```js

      满屏截图 () {
        // 动态创建画布
        const canvas = document.createElement("canvas");
        // 获取画笔
        const canvasCtx = canvas.getContext('2d');
        // 设置画布宽高
        canvas.width = 200;
        canvas.height = 200;
        // 获取容器的dom 此处以视频为例
        let videoDOM = document.getElementById('video');
        // 在画布上绘制图像
        canvasCtx.drawImage(video, 0, 0, canvas.width, canvas.height);
        canvasCtx.font = '16px 宋体';
        canvas.fillStyle = "#fff";
        canvasCtx.textBaseline = "maddle";
        canvasCtx.textAlign = "right";
        canvasCtx.fillText("时间", canvas.width - 10, canvas.height - 10);
        // 生成截图的base64 toDataURL()方法不能对跨域资源加载
        let imgBase64 = canvas.toDataURL("image/png");
        console.log(imgBase64);
    },

    框选截图 () {
        let flag = false;
        let start_X = null; // 开始x坐标
        let start_Y = null; // 开始y坐标
        let end_X = null; // 结束x坐标
        let end_Y = null; // 结束y坐标
        window.scroll(0, 0);
        let canvas = document.createElement("canvas");
        let canvasCtx = canvas.getContext('2d');
        let video = document.getElementById('video');;
        canvas.width = video.offsetWidth;
        canvas.height = video.offsetHeight;
        canvas.width = 660;
        canvas.height = 440;
        canvas.style.position = "absolute";
        canvas.style.top = "0px";
        canvas.style.left = "0px";
        video.parentElement.appendChild(canvas);
        canvas.onmousedown = (e) => {
            if (video) {
                flag = false;
                canvas.remove();
                return;
            } flag = true;
            start_X = e.offsetX;
            start_Y = e.offsetY;
        }
        canvas.onmousemove = (e) => {
            if (!flag) {
                canvasCtx.clearRect(0, 0, canvas.width, canvas.height);
                end_X = e.offsetX;
                end_Y = e.offsetY;
                // 调用画框函数(start_X,start_Y,end_X,end_Y)
            }
        }
        canvas.onmouseup = (e) => {
            flag = false;
            canvas.onmousemove = null;
            canvas.onmouseup = null;
            end_X = e.offsetX;
            end_Y = e.offsetY;
            canvasCtx.drawImage(video, start_X, start_Y, end_X - start_X, end_Y - start_Y);
            let imgBase64 = canvas.toDataURL("image/png");
            console.log(imgBase64);
            canvas.remove()
        }
    }

四.框选截图时有误差

其实就是你框选的范围和生成的base64图片有误差,这个因为图片的原因,图片原始尺寸跟你的r容器大小不一样,这个功能可以让后端算相对坐标来实现。大家还有啥好方法可以评论区讨论一下。`

相关文章
|
14天前
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
30 0
|
7天前
|
JavaScript 前端开发 Docker
前端全栈之路Deno篇(二):几行代码打包后接近100M?别慌,带你掌握Deno2.0的安装到项目构建全流程、剖析构建物并了解其好处
在使用 Deno 构建项目时,生成的可执行文件体积较大,通常接近 100 MB,而 Node.js 构建的项目体积则要小得多。这是由于 Deno 包含了完整的 V8 引擎和运行时,使其能够在目标设备上独立运行,无需额外安装依赖。尽管体积较大,但 Deno 提供了更好的安全性和部署便利性。通过裁剪功能、使用压缩工具等方法,可以优化可执行文件的体积。
前端全栈之路Deno篇(二):几行代码打包后接近100M?别慌,带你掌握Deno2.0的安装到项目构建全流程、剖析构建物并了解其好处
|
8天前
|
缓存 前端开发 JavaScript
前端架构思考:代码复用带来的隐形耦合,可能让大模型造轮子是更好的选择-从 CDN 依赖包被删导致个站打不开到数年前因11 行代码导致上千项目崩溃谈谈npm黑洞 - 统计下你的项目有多少个依赖吧!
最近,我的个人网站因免费CDN上的Vue.js包路径变更导致无法访问,引发了我对前端依赖管理的深刻反思。文章探讨了NPM依赖陷阱、开源库所有权与维护压力、NPM生态问题,并提出减少不必要的依赖、重视模块设计等建议,以提升前端项目的稳定性和可控性。通过“left_pad”事件及个人经历,强调了依赖管理的重要性和让大模型代替人造轮子的潜在收益
|
14天前
|
前端开发 JavaScript 开发工具
前端代码规范和质量是确保项目可维护性、可读性和可扩展性的关键(三)
前端代码规范和质量是确保项目可维护性、可读性和可扩展性的关键(三)
25 0
|
14天前
|
Web App开发 前端开发 JavaScript
前端代码规范和质量是确保项目可维护性、可读性和可扩展性的关键(二)
前端代码规范和质量是确保项目可维护性、可读性和可扩展性的关键(二)
31 0
|
14天前
|
Web App开发 移动开发 前端开发
前端代码规范和质量是确保项目可维护性、可读性和可扩展性的关键(一)
前端代码规范和质量是确保项目可维护性、可读性和可扩展性的关键(一)
34 0
|
14天前
|
Web App开发 存储 前端开发
前端开发必备:requestAnimationFrame、setInterval、setTimeout——功能解析与优劣对比
前端开发必备:requestAnimationFrame、setInterval、setTimeout——功能解析与优劣对比
52 0
|
14天前
|
移动开发 前端开发 JavaScript
前端开发实战:利用Web Speech API之speechSynthesis实现文字转语音功能
前端开发实战:利用Web Speech API之speechSynthesis实现文字转语音功能
81 0
|
14天前
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
|
14天前
|
人工智能 自然语言处理 运维
前端大模型应用笔记(一):两个指令反过来说大模型就理解不了啦?或许该让第三者插足啦 -通过引入中间LLM预处理用户输入以提高多任务处理能力
本文探讨了在多任务处理场景下,自然语言指令解析的困境及解决方案。通过增加一个LLM解析层,将复杂的指令拆解为多个明确的步骤,明确操作类型与对象识别,处理任务依赖关系,并将自然语言转化为具体的工具命令,从而提高指令解析的准确性和执行效率。