首页 前端知识 在web端快速实现选区截图功能(region-screenshot-js)

在web端快速实现选区截图功能(region-screenshot-js)

2024-08-30 03:08:18 前端知识 前端哥 345 24 我要收藏

前言

👉👉👉👉在线demo👈👈👈👈

本文介绍如何通过插件region-screenshot-js来简洁高效的在web端实现选区截图功能,并在截图上绘制出特定图案和马赛克,如果插件自带图案绘制不能满足你的需求,你可以通过插件的customDrawing配置项来自定义绘制。以下仅做基础示意,更多功能和用法请参见文档。这是我在工作之余开发的插件,近两千行代码,写了小两月。对于该插件的有任何建议或意见,可以在Issues里提出。如果有帮助到你,请点个star。

image.png

1.引入插件并创窗出建截图工具

—— region-screenshot-js支持在多个环境下使用,本文通过原生html来演示:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
body,
html {
height: 100%;
width: 100%;
}
* {
margin: 0;
padding: 0;
}
body {
background-image: url(./assets/bg.png);
background-size: cover;
background-position: center;
}
</style>
</head>
<body>
</body>
<script src="./dist/region-screenshot.umd.js"></script>
<script>
let screenshot = new RegionScreenshot();//执行实例化便会自动创建窗户截图工具
</script>
</html>
复制

此时查看页面,截图工具已被创建并可以正常使用。

image.png
bg.png
bg.png

2.进行一些自定义配置

下面演示对截图工具的全局颜色选项选区轮廓颜色进行配置,region-screenshot-js支持十余个自定义配置,更多配置项请参见文档。

let screenshot = new RegionScreenshot({
globalColorOptions:["red","pink","skyblue"],//配置全局颜色选项
regionColor:"#00ff28"//定义选区轮廓颜色
});
复制

再次查看页面,两个配置已生效
image.png

3.监听事件

在插件使用过程中,可能需要监听用户操作来做一些额外的事情,下面演示regionDraggingscreenshotGenerated事件。更多监听器请参见文档。

let screenshot = new RegionScreenshot({
globalColorOptions:["red","pink","skyblue"],//配置全局颜色选项
regionColor:"#00ff28"//定义选区轮廓颜色
});
screenshot.on("screenshotGenerated",(dataUrl)=>{
console.log(dataUrl)//截图完成时触发,可在回调中接收到截图的base64编码
});
screenshot.on("regionDragging",(region)=>{
console.log(region)//选区被拖动时触发,可在回调中接收到选区的位置信息
})
复制

4.开发自己的绘制工具

如果插件目前自带的绘制工具不能满足你的需求,你可以通过customDrawing配置项来自定义一个绘制工具,下面演示在插件中添加一个绘制表情包的例子。

customDrawing是一个包含customDrawingObject对象的数组,customDrawingObject对象的配置项如下所示:

配置项类型描述
classNameString自定义绘制项的类名
optionsHtmlString定义自定义绘制项二级菜单的html内容
onOptionsCreatedFunction当自定义绘制项的二级菜单创建完成该函数将被调用,可在参数中获取到二级菜单dom对象
onDrawingOpenFunction当自定义绘制项被激活时该函数将被调用,可在参数中获取到二级菜单dom对象canvas dom对象保存历史记录函数,注意:请在每次自定义绘制结束后调用保存历史记录函数,以确保插件的撤销功能正常
onDrawingCloseFunction当自定义绘制项被关闭时该函数将被调用,可在参数中获取到二级菜单dom对象canvas dom对象保存历史记录函数

示例代码:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
body,
html {
height: 100%;
width: 100%;
}
* {
margin: 0;
padding: 0;
}
body {
background-image: url(./assets/bg.png);
background-size: cover;
background-position: center;
}
.region-screenshot_custom_tools.emoji .region-screenshot_tools_btn {
background-image: url(./assets/emoji.png);
}
.region-screenshot_custom_tools.emoji.region-screenshot_active .region-screenshot_tools_btn {
background-image: url(./assets/emoji_active.png);
}
.region-screenshot_custom_tools.emoji .region-screenshot_tools_options img {
width: 20px;
margin-right: 10px;
cursor: pointer;
}
.region-screenshot_custom_tools.emoji .region-screenshot_tools_options img.active {
filter: brightness(1.2)
}
</style>
</head>
<body>
</body>
<script src="./dist/region-screenshot.umd.js"></script>
<script src="https://unpkg.com/jquery@3.7.1/dist/jquery.js"></script>
<script>
let screenshot = new RegionScreenshot({
globalColorOptions: ["red", "pink", "skyblue"],//配置全局颜色选项
regionColor: "#00ff28",//定义选区轮廓颜色
customDrawing: [
{
//自定义绘制项的类名
className: "emoji",
//自定义绘制项的二级菜单,这里放了四个表情
optionsHtml: `
<img class="active" src="assets/emoji-1.png"/>
<img src="assets/emoji-2.png"/>
<img src="assets/emoji-3.png"/>
<img src="assets/emoji-4.png"/>
`,
//当创建完二级菜单时这个函数将被调用,函数可以接受到二级菜单dom对象,你可以在这里为菜单添加事件
onOptionsCreated(optionsEl) {
$(optionsEl)
.find("img")
.click(function () {
$(this).addClass("active");
$(this).siblings().removeClass("active");
});
},
//当自定义绘制被激活时这个函被调用,
//函数可以接受到canvas dom对象和二级菜单dom对象,这里主要是编写向canvas绘制的逻辑
onDrawingOpen(canvasEl, optionsEl, saveCallback) {
let ctx = canvasEl.getContext("2d");
canvasEl.style.cursor = "crosshair";
canvasEl.onclick = function (e) {
let img = $(optionsEl).find(".active")[0];//获取到二级菜单里被选中的那个表情图片
ctx.drawImage(//将它绘制到点击的位置去
img,
e.offsetX - img.naturalWidth / 2,
e.offsetY - img.naturalWidth / 2
);
saveCallback();//保存当前画布,注意:为了撤销功能正常运行,请务必调用该回调。!!!
};
},
//当自定义绘制被关闭时调用,这里主要用来关闭对canvas的事件绑定
onDrawingClose(canvasEl,optionsEl) {
canvasEl.onclick = null;
canvasEl.style.cursor = "default";
},
},
],
});
screenshot.on("screenshotGenerated", (dataUrl) => {
console.log(dataUrl)//截图完成时触发,可在回调中接收到截图的base64编码
});
screenshot.on("regionDragging", (region) => {
console.log(region)//选区被拖动时茶法,可在回调中接收到选区的位置信息
})
</script>
</html>
复制

这样你就得到了一个绘制表情包的功能(酷不酷):
image.png

emoji_active.png emoji.png

emoji.png emoji_active.png

emoji-1.png emoji-1.png

emoji-2.png emoji-2.png

emoji-3.png emoji-3.png

emoji-4.png emoji-4.png

它如何工作

region-screenshot-js的核心原理是使用WebRTC(Web Real-Time Communication)技术,读取浏览器标签页信息。因此region-screenshot-js只允许在本地环境或者HTTPS环境中运行。
你也可以通过如下设置使浏览器在在非HTTPS环境中运行region-screenshot-js,假设使用Chrome浏览器: (请谨慎使用,这可能引入安全隐患)

  1. 进入chrome://flags/#unsafely-treat-insecure-origin-as-secure
  2. 在Insecure origins treated as secure文本框中输入你的网站地址,例如:https://www.example.com
  3. 勾选右侧Enable

总结

本文使用插件region-screenshot-js快速实现了一个web端选区截图功能,并利用插件向外抛出的接口开发了自己的绘制功能,更多配置项或其他相关功能。具体请参阅插件文档。对于该插件的有任何建议或意见,可以在Issues里提出。如果有帮助到你,请点个star。

转载请注明出处或者链接地址:https://www.qianduange.cn//article/17166.html
标签
评论
还可以输入200
共0条数据,当前/页
发布的文章

安装Nodejs后,npm无法使用

2024-11-30 11:11:38

大家推荐的文章
会员中心 联系我 留言建议 回顶部
复制成功!