Edge 浏览器插件开发:图片切割插件

news2024/11/7 7:52:47

Edge 浏览器插件开发:图片切割插件

在图片处理领域,按比例切割图片是一个常见需求。本文将带你开发一个 Edge 浏览器插件,用于将用户上传的图片分割成 4 个部分并自动下载到本地。同时,本文介绍如何使用 cursor 辅助工具来更高效地实现和调试插件功能。

先看效果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
点击分割图片后:
在这里插入图片描述
在这里插入图片描述

功能概述

插件的主要功能包括:

  1. 用户上传并预览图片。
  2. 将图片平均分割成 4 份。
  3. 自动下载分割的图片到本地默认文件夹。

通过 cursor 辅助工具,我们可以高效地管理代码中的事件和操作流,确保插件在多个步骤中流畅运行,并能够在图片加载、分割和下载的每个关键步骤中实时监控进程状态。


使用 cursor 辅助工具

在插件开发中,cursor 工具可以帮助我们实现多步事件的顺序执行和状态管理。下面的代码将展示如何在 popup.js 中利用 cursor 来管理图片处理流程。


开发步骤

1. 创建项目结构

在项目目录下创建以下文件:

  • manifest.json:插件的配置文件。
  • popup.html:插件的用户界面。
  • popup.js:实现插件的核心逻辑和 cursor 功能。
  • icons 目录:存储插件的图标文件(如 icon16.pngicon48.png 等)。
2. 配置 manifest.json

manifest.json 是插件的核心配置文件,声明了插件的基础信息和权限。该插件需要 downloads 权限来下载图片到本地。代码如下:

{
  "manifest_version": 3,
  "name": "图片分割工具",
  "version": "1.0",
  "description": "将图片平均分割成4份并下载",
  "action": {
    "default_popup": "popup.html",
    "default_icon": {
      "16": "icons/icon16.png",
      "32": "icons/icon32.png",
      "48": "icons/icon48.png",
      "128": "icons/icon128.png"
    }
  },
  "permissions": ["downloads"]
}
3. 设计用户界面 popup.html

popup.html 中设计用户界面,包括文件选择器、图片预览、分割按钮和状态显示区域:

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <style>
    body { width: 300px; padding: 10px; font-family: Arial, sans-serif; }
    #preview { max-width: 100%; margin: 10px 0; border: 1px solid #ccc; }
    .button { width: 100%; padding: 8px; background-color: #4CAF50; color: white; border: none; border-radius: 4px; cursor: pointer; }
    .button:disabled { background-color: #cccccc; }
    #status { margin-top: 10px; color: #333; background-color: #f0f0f0; border-radius: 4px; padding: 5px; }
  </style>
</head>
<body>
  <input type="file" id="imageInput" accept="image/*">
  <img id="preview" style="display: none;">
  <button id="splitButton" class="button" disabled>分割图片</button>
  <div id="status">请选择一张图片</div>
  <script src="popup.js"></script>
</body>
</html>
4. 实现核心逻辑 popup.js

popup.js 中使用 cursor 工具来管理图片处理步骤,包括加载、分割、和自动下载。

// 使用 cursor 工具在多步流程中跟踪状态和事件
import cursor from 'cursor';

document.addEventListener('DOMContentLoaded', function() {
  const imageInput = document.getElementById('imageInput');
  const preview = document.getElementById('preview');
  const splitButton = document.getElementById('splitButton');
  const status = document.getElementById('status');
  let originalImage = null;
  let originalFileName = '';

  const showStatus = cursor.create({
    defaultStatus: '请选择一张图片',
    updateStatus: function(message) {
      status.textContent = message;
      console.log(message);
    }
  });

  imageInput.addEventListener('change', function(e) {
    const file = e.target.files[0];
    if (file) {
      originalFileName = file.name.replace(/\.[^/.]+$/, '');
      showStatus.updateStatus('正在加载图片...');
      
      const reader = new FileReader();
      reader.onload = function(event) {
        preview.src = event.target.result;
        preview.style.display = 'block';
        originalImage = new Image();
        originalImage.src = event.target.result;
        originalImage.onload = function() {
          splitButton.disabled = false;
          showStatus.updateStatus(`图片已加载,尺寸: ${originalImage.width}x${originalImage.height}`);
        };
      };
      reader.readAsDataURL(file);
    }
  });

  splitButton.addEventListener('click', async function() {
    try {
      if (!originalImage) {
        showStatus.updateStatus('请先选择图片');
        return;
      }

      splitButton.disabled = true;
      showStatus.updateStatus('开始分割图片...');

      const canvas = document.createElement('canvas');
      const ctx = canvas.getContext('2d');
      const partWidth = Math.floor(originalImage.width / 2);
      const partHeight = Math.floor(originalImage.height / 2);
      
      canvas.width = partWidth;
      canvas.height = partHeight;

      for (let row = 0; row < 2; row++) {
        for (let col = 0; col < 2; col++) {
          ctx.clearRect(0, 0, canvas.width, canvas.height);
          ctx.drawImage(
            originalImage,
            col * partWidth, row * partHeight,
            partWidth, partHeight,
            0, 0,
            partWidth, partHeight
          );

          const blob = await new Promise(resolve => canvas.toBlob(resolve, 'image/png'));
          const url = URL.createObjectURL(blob);
          
          try {
            await chrome.downloads.download({
              url: url,
              filename: `${originalFileName}_split_${row+1}x${col+1}.png`,
              saveAs: false
            });
            showStatus.updateStatus(`已完成 ${row * 2 + col + 1}/4 张图片`);
          } catch (error) {
            console.error('下载失败:', error);
            showStatus.updateStatus(`下载失败: ${error.message}`);
          } finally {
            URL.revokeObjectURL(url);
          }
        }
      }

      showStatus.updateStatus('所有图片分割完成!');
    } catch (error) {
      console.error('处理过程出错:', error);
      showStatus.updateStatus(`处理出错: ${error.message}`);
    } finally {
      splitButton.disabled = false;
    }
  });
});

运行与测试

1. 加载插件

在 Edge 浏览器中,访问 edge://extensions/,启用“开发者模式”,选择“加载已解压的扩展程序”并选择项目文件夹。

2. 测试流程
  1. 上传一张图片,确认图片是否成功显示在预览区域。
  2. 点击“分割图片”按钮,观察插件是否顺利完成图片分割和下载。
3. cursor 调试优势
  • 进度实时更新cursor 帮助我们实时跟踪每一步的状态,如“图片加载中”、“开始分割图片”等,让用户直观地了解操作进度。
  • 错误捕捉与提示:利用 cursor 定位和反馈错误信息,确保用户在出现异常时能够清楚知道原因。

总结与扩展思路

通过本插件,我们了解了图片分割处理的基本流程,以及如何借助 cursor 工具在插件开发中高效管理流程。插件在 Edge 和 Chrome 浏览器上均可运行,并支持进一步扩展,例如添加用户自定义切割比例、支持不同的文件格式和 UI 优化。

借助 cursor,你可以让插件的事件流更可控、流程更顺畅。这为进一步优化插件功能和用户体验提供了良好的基础。如果你有其他想法或改进建议,欢迎一起讨论!


参考网址:https://mp.weixin.qq.com/s/KZt5-3OxCtlwuTKhplzGCg
完整代码网址:https://github.com/yyq2024/split_image

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

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

相关文章

关于圆周率

关于圆周率 大约20年前的2005年&#xff0c;我在上大学的时候&#xff0c;网上流传这样一段程序&#xff0c;被称之为“外星人计算圆周率程序”。程序如下&#xff1a; long a 10000, b, c 2800, d, e, f[2801], g; main() {for (; b - c;) f[b] a / 5; for (; d 0, g …

【docker】6. 镜像仓库/镜像概念

Docker Registry&#xff08;镜像仓库&#xff09; 什么是 Docker Registry 镜像仓库 (Docker Registry) 负责存储、管理和分发镜像&#xff0c;并且提供了登录认证能力&#xff0c;建立了仓库的索引。 镜像仓库管理多个 Repository&#xff0c; Repository 通过命名来区分。…

debian系统安装qt的时候 显示xcb相关文件缺失

如果是安装之后的问题 我们可以选择使用ldd的命令查看当前依赖的so那些文件确实 ldd /home/yinsir/Qt/5.15.2/gcc_64/plugins/platforms/libqxcb.so 本人在进行打包的时候 出现则会个报错 ERROR: ldd outputLine: “libxcb-util.so.1 > not found” ERROR: for binary: “/…

怎么查看navicat的数据库密码

步骤1:打开navicat连接数据库工具&#xff0c;顶部的文件栏-导出结果-勾选导出密码-导出 步骤2&#xff1a;导出结果使用NotePad或文本打开&#xff0c;找到&#xff0c;数据库对应的的Password"995E66F64A15F6776“”的值复制下来 <Connection ConnectionName"…

清华大学提出Mini-Omni2:开源多模态模型,功能与GPT-4o媲美!

&#x1f310; 在人工智能领域&#xff0c;多模态模型的发展正如火如荼。今天&#xff0c;我们要介绍的是由清华大学提出的Mini-Omni2&#xff0c;这是一个开源的多模态语言模型&#xff0c;它在功能上与GPT-4o相媲美&#xff0c;能够理解和生成视觉、听觉和文本内容&#xff0…

webrtc前端播放器完整案例

https://download.csdn.net/download/jinhuding/89961792

网管平台(进阶篇):如何正确的管理网络设备?

网络设备作为构建计算机网络的重要基石&#xff0c;扮演着数据传输、连接和管理的关键角色。从交换机、路由器到防火墙、网关&#xff0c;各类网络设备共同协作&#xff0c;形成了高效、稳定的网络系统。本文将详细介绍网络设备的种类&#xff0c;并探讨如何正确管理这些设备&a…

深入理解 Spring AOP:面向切面编程的原理与应用

一、概述 AOP&#xff08;Aspect Orient Programming&#xff09;是一种设计思想&#xff0c;是软件设计领域中的面向切面编程&#xff0c;它是面向对象编程(OOP)的一种补充和完善。它以通过预编译方式和运行期动态代理方式&#xff0c;实现在不修改源代码的情况下给程序动态统…

ML 系列:机器学习和深度学习的深层次总结( 19)— PMF、PDF、平均值、方差、标准差

一、说明 在概率和统计学中&#xff0c;了解结果是如何量化的至关重要。概率质量函数 &#xff08;PMF&#xff09; 和概率密度函数 &#xff08;PDF&#xff09; 是实现此目的的基本工具&#xff0c;每个函数都提供不同类型的数据&#xff1a;离散和连续数据。 二、PMF 的定义…

基于STM32的八位数码管显示Proteus仿真设计

基于STM32的八位数码管显示Proteus仿真设计 1.主要功能2.仿真设计3. 程序设计4. 设计报告5. 资料清单&下载链接 基于STM32的八位数码管显示Proteus仿真设计(仿真程序设计报告讲解视频&#xff09; 仿真图proteus 8.9 程序编译器&#xff1a;keil 5 编程语言&#xff1a;…

Linux grep命令详解(多图、多示例)

文章目录 grep基本说明grep参数简单示例列举参数-v(反选)-r -l -H -i(目录子目录、只打印匹配文件、输出文件名、忽略大小写)-c -n -o(匹配次数、输出行号、只打印匹配)-A -B -C(前后行) 正则表达式基本正则表达式与扩展正则表达式 grep示例附录:正则表达式基本字符特殊字符Per…

力扣:225 用队列实现栈

栈、队列 栈&#xff1a; 弹夹&#xff0c;后进先出 队列&#xff1a; 排队&#xff0c;先进先出 描述&#xff1a; var MyStack function () {// 定义两个数组&#xff0c;模拟队列this.queue []this._queue [] };/** * param {number} x* return {void}*/ MyStack.protot…

【MFC编程(一)】MFC概述

文章目录 MFC概述MFC组成MFC对比Windows APIMFC类库基类CObject命令发送类CCmdTarget应用程序结构类应用程序线程支持类CWinThread/CWinApp文档类CDocument文档模板类CDocTemplate 窗口类窗口基类CWnd边框窗口类CFrameWnd视图类CView MFC概述 MFC&#xff08;Microsoft Founda…

【客观理性深入讨论国产中间件及数据库-科创基础软件】

随着国产化的进程&#xff0c;越来越多的国企央企开始要求软件产品匹配过程化的要求&#xff0c; 最近有一家银行保险的科技公司对行为验证码产品就要求匹配国产中间件&#xff0c; 于是开始了解国产中间件都有哪些厂家 一&#xff1a;国产中间件主要产品及厂商 1 东方通&…

基于Python的校园爱心帮扶管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

pycharm小游戏贪吃蛇及pygame模块学习()

由于代码量大&#xff0c;会逐渐发布 一.pycharm学习 在PyCharm中使用Pygame插入音乐和图片时&#xff0c;有以下这些注意事项&#xff1a; 插入音乐&#xff1a; - 文件格式支持&#xff1a;Pygame常用的音乐格式如MP3、OGG等&#xff0c;但MP3可能需额外安装库&#xf…

A018基于Spring Boot的民宿租赁系统

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600…

​基于学习的地铁客流动态预测智能调度方法

1 文章信息 文章题为“A Learning Based Intelligent Train RegulationMethod With Dynamic Prediction forthe Metro Passenger Flow”&#xff0c;该文于2023年发表至“IEEE TRANSACTIONS ON INTELLIGENT TRANSPORTATION SYSTEMS”。文章的核心观点是提出了一种基于学习的智…

SpringBoot+FileBeat+ELK8.x版本收集日志

一、准备环境 1、ElasticSearch&#xff1a;8.1.0 2、FileBeat&#xff1a;8.1.0 3、Kibana&#xff1a;8.1.0 4、logstach&#xff1a;8.1.0 本次统一版本&#xff1a;8.1.0,4个组件&#xff0c;划分目录&#xff0c;保持版本一致。 说明&#xff1a;elasticsearch和kib…

【大数据学习 | HBASE】habse的表结构

在使用的时候hbase就是一个普通的表&#xff0c;但是hbase是一个列式存储的表结构&#xff0c;与我们常用的mysql等关系型数据库的存储方式不同&#xff0c;mysql中的所有列的数据是按照行级别进行存储的&#xff0c;查询数据要整个一行查询出来&#xff0c;不想要的字段也需要…