前端实现图片压缩:基于 HTML5 File API 与 Canvas 的完整方案

在 Web 开发中,处理用户上传的图片时,前端压缩可以有效减少服务器压力并提升上传效率。本文将详细讲解如何通过<input type="file">实现图片上传,结合 Canvas 实现图片压缩,并实时展示压缩前后的图片预览和文件大小对比。

一、核心功能架构

我们将实现以下功能模块:

  1. 文件选择组件:使用 HTML 原生文件输入控件
  2. 图片预览区域:展示原始图片和压缩后图片
  3. 大小对比显示:实时显示压缩前后的文件大小(KB/MB)
  4. 压缩操作按钮:触发图片压缩逻辑
  5. 进度反馈:通过视觉提示显示处理状态

最终效果如下:

二、HTML 基础结构

首先构建页面骨架,包含文件输入、预览区域和信息展示模块:

<div class="container"><h1>图片压缩工具</h1><!-- 文件上传组件 --><input type="file" accept="image/*" id="imageInput" /><!-- 操作按钮 --><button id="compressBtn" disabled>开始压缩</button><!-- 预览区域 --><div class="preview-container"><div class="preview-item"><h3>原始图片</h3><div id="originalPreview"></div><span id="originalSize"></span></div><div class="preview-item"><h3>压缩后图片</h3><div id="compressedPreview"></div><span id="compressedSize"></span></div></div>
</div>

三、CSS 样式设计

使用 Flex 布局实现响应式预览,添加视觉反馈样式:

.container {max-width: 1200px;margin: 0 auto;padding: 20px;
}.preview-container {display: flex;gap: 40px;margin-top: 30px;
}.preview-item {flex: 1;border: 1px solid #eee;padding: 20px;border-radius: 8px;
}img {max-width: 100%;max-height: 400px;object-fit: contain;display: block;margin: 20px 0;
}button {padding: 10px 20px;background-color: #4a90e2;color: white;border: none;border-radius: 4px;cursor: pointer;margin: 20px 0;
}button:disabled {background-color: #ccc;cursor: not-allowed;
}.size-info {color: #666;font-size: 0.9em;
}

四、核心 JavaScript 逻辑

1. 初始化事件绑定

const imageInput = document.getElementById('imageInput');
const compressBtn = document.getElementById('compressBtn');
const originalPreview = document.getElementById('originalPreview');
const compressedPreview = document.getElementById('compressedPreview');
const originalSize = document.getElementById('originalSize');
const compressedSize = document.getElementById('compressedSize');imageInput.addEventListener('change', handleImageChange);
compressBtn.addEventListener('click', handleCompression);

2. 图片选择处理函数

let selectedImage = null;function handleImageChange(e) {const file = e.target.files[0];if (file && isImageFile(file)) {selectedImage = {file: file,type:

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

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

相关文章

通信算法之280:无人机侦测模块知识框架思维导图

1. 无人机侦测模块知识框架思维导图, 见文末章节。 2. OFDM参数估计,基于循环自相关特性。 3. 无人机其它参数估计

单片机寄存器的四种主要类型!

1. 控制寄存器&#xff08;Control Registers&#xff09;​​ ​​专业定义​​&#xff1a;用于配置硬件行为或触发操作的寄存器。 ​​大白话​​&#xff1a; 相当于设备的​​“控制面板”​​&#xff0c;通过写入特定值来​​开关功能​​或​​调整参数​​。例如&am…

第100+41步 ChatGPT学习:R语言实现误判病例分析

本期是《第33步 机器学习分类实战&#xff1a;误判病例分析》的R版本。 尝试使用Deepseek-R1来试试写代码&#xff0c;效果还不错。 下面上R语言代码&#xff0c;以Xgboost为例&#xff1a; # 加载必要的库 library(caret) library(pROC) library(ggplot2) library(xgboost)…

HTML Day04

Day04 0.引言1. HTML字符实体2. HTML表单2.1 表单标签2.2 表单示例 3. HTML框架4. HTML颜色4.1 16进制表示法4.2 rgba表示法4.3 名称表达法 5. HTML脚本 0.引言 刚刚回顾了前面几篇博客&#xff0c;感觉写的内容倒是很详细&#xff0c;每个知识点都做了说明。但是感觉在知识组织…

comfyui 工作流中 视频长度和哪些参数有关? 生成15秒的视频,再加上RTX4060 8G显卡,尝试一下

想再消费级显卡上生成15秒长视频&#xff0c;还是比较慢的&#xff0c;不过动漫的画质要求比较低 在ComfyUI中生成15秒视频需综合考虑视频参数配置、模型选择和硬件优化&#xff0c;尤其针对RTX 4060 8G显存的限制。 ⏱️ 一、影响视频长度的核心参数 总帧数&#xff08;video_…

Netty 实战篇:构建高性能聊天服务器

在前两篇文章中&#xff0c;我们深入探讨了 Netty 的 IO 模型以及其核心组件的工作原理。本篇文章将通过一个实际的聊天服务器示例&#xff0c;展示如何使用 Netty 构建高性能的网络应用。 一、项目结构 项目主要包含以下几个部分&#xff1a; ChatServer&#xff1a;服务器启…

智绅科技——科技赋能健康养老,构建智慧晚年新生态

当老龄化浪潮与数字技术深度碰撞&#xff0c;智绅科技以 “科技赋能健康&#xff0c;智慧守护晚年” 为核心理念&#xff0c;锚定数字健康与养老服务赛道&#xff0c;通过人工智能、物联网、大数据等技术集成&#xff0c;为亚健康群体与中老年人群构建 “监测 - 预防 - 辅助 - …

Tkinter软件——显示txt标签的目标水平边框图像

代码&#xff1a; import tkinter as tk from tkinter import filedialog from tkinter import messagebox import cv2 from PIL import Image, ImageTk import osclass ImageBoxApp:def __init__(self, master):self.master masterself.master.title("Image Box Drawer…

Linux 文件覆盖机制与实践:以 mv 命令为切入点

引言&#xff1a;文件覆盖的本质 文件覆盖是 Linux 文件系统中常见的操作&#xff0c;指的是在目标路径已存在文件的情况下&#xff0c;将源文件的内容写入目标文件&#xff0c;导致目标文件的原有内容被替换。在 Linux 中&#xff0c;文件覆盖通常通过命令行工具&#xff08;…

学习路之PHP--easyswoole操作数据库

学习路之PHP--easyswoole操作数据库 0、安装orm插件一、创建数据库二、创建模型三、控制器显示四、效果五、问题 0、安装orm插件 composer require easyswoole/orm一、创建数据库 表&#xff1a; CREATE TABLE cases (id int(11) NOT NULL AUTO_INCREMENT COMMENT 主键,titl…

手写multi-head Self-Attention,各个算子详细注释版

文章目录 MultiHeadAttentionFormal的实现操作详解1. &#x1f50d; attention_mask2. &#x1f50d; matmul✅ 其他实现方式1. 使用 运算符&#xff08;推荐简洁写法&#xff09;2. 使用 torch.einsum()&#xff08;爱因斯坦求和约定&#xff09;3. 使用 torch.bmm()&#xf…

尚硅谷redis7 41-46 redis持久化之AOF异常恢复演示

AOF每一秒钟写入一次。当内容才写了一小半,没有写完整时&#xff0c;突然,redis挂了,导致aof文件错误。 故意乱写正常的AOF文件,模拟网络闪断文件写error 重启 Redis 之后就会进行AOF文件的载入,发现启动都失败 首先cd /usr/local/bin 异常修复命令:redis-check-aof -- fix 进…

004时装购物系统技术解析:构建智能时尚消费平台

时装购物系统技术解析&#xff1a;构建智能时尚消费平台 在电商行业蓬勃发展的当下&#xff0c;时装购物系统凭借其便捷性与多样性&#xff0c;成为消费者选购时尚单品的重要渠道。该系统通过商品信息、订单管理等核心模块&#xff0c;结合前台展示与后台录入功能&#xff0c;…

数据湖 (特点+与数据仓库和数据沼泽的对比讲解)

数据湖就像一个“数据水库”&#xff0c;把企业所有原始数据&#xff08;结构化的表格、半结构化的日志、非结构化的图片/视频&#xff09;原样存储&#xff0c;供后续按需分析。 对比传统数据仓库&#xff1a; 数据仓库数据湖数据清洗后的结构化数据&#xff08;如Excel表格&…

深度剖析Node.js的原理及事件方式

早些年就接触过Node.js&#xff0c;当时对于这个连接前后端框架就感到很特别。尤其是以独特的异步阻塞特性&#xff0c;重塑了了服务器端编程的范式。后来陆陆续续做了不少项目&#xff0c;通过实践对它或多或少增强了不少理解。今天&#xff0c;我试着将从将从原理层剖析其运行…

【AI预测】5月30日尼克斯大战前瞻:东部黑马能否再下一城?

&#x1f3c0; 随着赛季进入白热化阶段&#xff0c;5月30日尼克斯的这场比赛注定焦点十足。作为东部近年来少有的“黑马型”球队&#xff0c;尼克斯用硬朗的防守和团队配合让人重新认识了这支老牌劲旅。 这篇文章&#xff0c;我们将从数据模型球员表现战术执行力三个维度&…

人工智能赋能基础教育个性化学习的理论建构与实践探索

一、引言 1.1 研究背景与意义 随着科技的飞速发展&#xff0c;人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;已逐渐成为推动社会进步的重要力量。在教育领域&#xff0c;人工智能的应用正逐步改变传统的教学模式&#xff0c;为个性化学习提供了新…

历年四川大学计算机保研上机真题

2025四川大学计算机保研上机真题 2024四川大学计算机保研上机真题 2023四川大学计算机保研上机真题 在线测评链接&#xff1a;https://pgcode.cn/school 分数求和 题目描述 有一分数序列&#xff1a; 2 / 1 2/1 2/1, 3 / 2 3/2 3/2, 5 / 3 5/3 5/3, 8 / 5 8/5 8/5, 13 /…

正点原子Z15I ZYNQ 开发板发布!板载PCIe2.0、SPFx2、MIPI CSI等接口,资料丰富!

正点原子Z15I ZYNQ 开发板发布&#xff01;板载PCIe2.0、SPFx2、MIPI CSI等接口&#xff0c;资料丰富&#xff01; 正点原子Z15I ZYNQ开发板&#xff0c;核心板全工业级设计&#xff0c;主控芯片的型号是XC7Z015CLG485-2I。开发板由核心板&#xff0b;底板组成&#xff0c;外设…

Ubuntu 22.04 上使用 Docker 安装 RagFlow

GitHub地址:添加链接描述 RAGFlow 是一款开源的检索增强生成(Retrieval-Augmented Generation,简称 RAG)引擎,旨在通过深度文档理解技术,结合大语言模型(LLM),为用户提供高质量、可溯源的问答服务。 🚀 快速入门 RAGFlow 提供了便捷的部署方式,支持 Docker 环境。…