canvas去除图片空白部分,图片裁剪

news/2025/2/6 14:17:50/文章来源:https://www.cnblogs.com/li-sir/p/18700995

canvas去除图片空白部分实现图片的缩小,可用于vue-signature-pad 签名实现签名裁剪,图片裁剪

电子签名连接 https://blog.csdn.net/Shids_/article/details/135695601

<!DOCTYPE html>
<html><head><meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1"><title></title></head><body><button onclick="handleClear()">去除</button><div class="view-box"><div class="view-content"><img class="img" src="https://cdn.shopifycdn.net/s/files/1/0343/0275/4948/files/png_7261d2f1-9f99-4972-8e2f-7a00535a9f34.png?v=1634027745" alt=""><div class="arrow"><svg t="1640838036592" class="icon" viewBox="0 0 1024 1024" version="1.1"xmlns="http://www.w3.org/2000/svg" p-id="4100" width="128" height="128"><pathd="M916.70478 440.270049L531.68078 217.987122c-21.079415-12.188098-47.953171-13.08722-70.631024 0s-35.365463 36.764098-35.365463 61.140293v97.304975H127.37561c-34.766049 0-62.938537 28.172488-62.938537 62.938537v145.258146c0 34.766049 28.172488 62.938537 62.938537 62.938537h298.308683v90.411707c0 26.673951 13.886439 52.748488 38.662244 67.034537 24.775805 14.385951 54.247024 13.386927 77.524292 0l374.833951-216.388683c25.674927-14.685659 42.858146-42.458537 42.858147-74.227512 0-31.469268-17.18322-59.242146-42.858147-74.12761z"p-id="4101" fill="#ffffff"></path></svg></div><img class="img" id="img" src="" alt=""></div></div><script type="text/javascript">async function handleClear() {// const url = "https://cdn.shopifycdn.net/s/files/1/0343/0275/4948/files/png_7261d2f1-9f99-4972-8e2f-7a00535a9f34.png?v=1634027745";
const bigURL = 'https://cdn.shopifycdn.net/s/files/1/0343/0275/4948/files/png_7261d2f1-9f99-4972-8e2f-7a00535a9f34.png?v=1634027745'const base64 = await clearImageEdgeBlank(bigURL, 4);console.log(base64)document.getElementById("img").setAttribute("src", base64);}handleClear();/*** 清楚图片周围空白区域* @param {string} url - 图片地址或base64* @param {number} [padding=0] - 内边距* @return {string} base64 - 裁剪后的图片字符串*/function clearImageEdgeBlank(url, padding = 0) {console.log(url)console.log(padding)return new Promise((resolve, reject) => {// create canvas
                    const canvas = document.createElement("canvas");const ctx = canvas.getContext("2d");// create image
                    const image = new Image();image.onload = draw;image.src = url;image.crossOrigin = "Anonymous";function draw() {canvas.width = image.width;canvas.height = image.height;ctx.drawImage(image, 0, 0, canvas.width, canvas.height);const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);const {data,width,height} = imageData;// 裁剪需要的起点和终点,初始值为画布左上和右下点互换设置成极限值。
                        let startX = width,startY = height,endX = 0,endY = 0;/*col为列,row为行,两层循环构造每一个网格,便利所有网格的像素,如果有色彩则设置裁剪的起点和终点*/console.log('开始')const startTime = Date.now();for (let col = 0; col < width; col++) {for (let row = 0; row < height; row++) {// 网格索引
                                const pxStartIndex = (row * width + col) * 4;// 网格的实际像素RGBA
                                const pxData = {r: data[pxStartIndex],g: data[pxStartIndex + 1],b: data[pxStartIndex + 2],a: data[pxStartIndex + 3]};// 存在色彩:不透明
                                const colorExist = pxData.a !== 0;/*如果当前像素点有色彩startX坐标取当前col和startX的最小值endX坐标取当前col和endX的最大值startY坐标取当前row和startY的最小值endY坐标取当前row和endY的最大值*/if (colorExist) {startX = Math.min(col, startX);endX = Math.max(col, startX);startY = Math.min(row, startY);endY = Math.max(row, endY);}}}const interval = Date.now() - startTime;console.log('总共耗时', interval);// 右下坐标需要扩展1px,才能完整的截取到图像
                        endX += 1;endY += 1;// 加上padding
                        startX -= padding;startY -= padding;endX += padding;endY += padding;// 根据计算的起点终点进行裁剪
                        const cropCanvas = document.createElement("canvas");const cropCtx = cropCanvas.getContext("2d");cropCanvas.width = endX - startX;cropCanvas.height = endY - startY;cropCtx.drawImage(image,startX,startY,cropCanvas.width,cropCanvas.height,0,0,cropCanvas.width,cropCanvas.height);// rosolve裁剪后的图像字符串
                        resolve(cropCanvas.toDataURL());}});}</script></body>
</html>

 

 

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

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

相关文章

Avalonia系列文章之控件简介

对于GUI(图形用户页面)程序来说,控件是创建用户页面的基本构建块,不同的控件代表不同的功能,如按钮,文本框,滑块等。在Avalonia UI中,了解控件的使用及其特性对于创建应用程序至关重要。对于GUI(图形用户页面)程序来说,控件是创建用户页面的基本构建块,不同的控件代表不…

DeepSeek+AnythingLLM打造自己大模型知识库

有些用户或是专家在项目建设中提出来要提炼工艺库、模型库、算法库等知识库,可以试着让deepseek成为每个角色的助手,例如工艺的、信息化的、设备的、电气的等角色,让deepseek成为自己,再不断的迭代它。deepseek扮演AI助手的角色,应用越来越发挥出来应有的价值。 DeepSeek+…

基于 AI 的代码审计工具,支持多种语言,支持DeepSeek-R1,ChatGPT-4o等多种大模型。

免责声明 仅供安全研究与学习之用,若将工具做其他用途,由使用者承担全部法律及连带责任,作者及发布者不承担任何法律及连带责任。工具介绍基于 AI 的代码安全审计工具,支持多种编程语言的代码分析,可以帮助开发者快速发现代码中的潜在安全漏洞。支持DeepSeek-R1,ChatGPT-…

GEO SFxxxx系列振弦式应变计 混凝土结构监测应变和温度

GEO SFxxxx系列振弦式应变计 混凝土结构监测应变和温度振弦式应变计被广泛用于长期埋设在水工建筑物或其他混凝土结构物内部,如梁、柱、桩基、挡土墙、衬砌、墩以及基岩等,用于测量埋设点的线性变形(应变)和应力。同时,它也可以同时测量埋设点的温度。 GEO SFxxxx系列振弦…

部署mysql

一、环境名称 备注操作命令对象 Docker 版本26.1.3远程操作系统 CentOS 7.9 64位远程管理工具 FinalShell 版本4.3.11安装软件名称 MySQL 版本8.3.0二、拉取镜像 2.1 查找 Docker Hub 上的 MySQL 镜像 docker search mysql2.2 拉取MySQL镜像 由于我本地用的是8.3.0的,所以服务…

虚拟机安装麒麟操作系统

1.新建虚拟机 参考地址:https://blog.csdn.net/weixin_52799373/article/details/144770961

7 个丑陋的利基网站,每月赚超过5000美元

​这张图由作者使用Ideogram制作。很难相信,但一些1999年的老旧丑陋网站依然存在。令人惊讶的是,它们的表现非常好。 这些网站有闪烁的文字、鲜艳的颜色和笨重的设计,让今天的网页设计师都感到不舒服。 但你猜怎么着?这些“丑陋”的网站正在为它们的拥有者赚取大量的钱。 现…

【榜单解析】2025年最具潜力的10大项目管理软件,你选对了吗?

在当今竞争激烈的商业环境中,项目管理的高效性直接影响着企业的成败。一款合适的项目管理软件,能够帮助团队提升协作效率、优化资源分配、确保项目按时交付。随着科技的不断发展,市场上涌现出了各种各样的项目管理软件,让人眼花缭乱。今天,我们就为大家详细解析 2025 年最…

高斯溅射和GIS融合之路- 将splat文件切片成3dtiles

这篇文章主要介绍了如何将高斯泼溅的splat文件切片成3DTiles格式,以便在Cesium等GIS引擎中高效渲染。通过GISBox工具实现切片,并讨论了Cesium对KHR_gaussian_splatting扩展的支持。在具体介绍山海鲸团队如何实现对高斯泼溅模型进行切片并在Cesium中渲染之前,我们先来回顾一下…

MySQL常用编码格式详解utf8、utf8mb4、utf8mb4_unicode_ci 、utf8mb4_0900_ai_ci

前言常用字符集utf8utf8mb4排序规则(Collation)utf8mb4_general_ciutf8mb4_unicode_ciutf8mb4_0900_ai_ci总结对比使用建议示例前言 在使用MySQL创建数据库时候免不了选择字符集和排序规则,不同的字符集对应不同的排序规则,不同的排序规则的性能和效果是不一样的。一般我们…

JS-50 事件类型之表单事件

表单事件是在使用表单元素及输入框元素可以监听的一系列事件 ①input事件②select事件③Change事件④reset事件⑤submit事件 1、input事件input事件当<input>、<select>、<textarea>的值发生变化时触发。对于复选框(<input type=checkbox>)或单选框(…