news 2026/4/15 19:43:14

原生图片大小编辑

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
原生图片大小编辑

创建html文件-复制代码到html文件-浏览器打卡html文件

<!DOCTYPE html>

<html lang="zh-CN">

<head>

<meta charset="UTF-8">

<title>图片实际尺寸修改 & 压缩</title>

<style>

.container {

max-width: 800px;

margin: 20px auto;

padding: 20px;

}

.btn {

margin: 10px 0;

padding: 8px 16px;

background: #0078d7;

color: white;

border: none;

border-radius: 4px;

cursor: pointer;

}

.btn:disabled {

background: #ccc;

cursor: not-allowed;

}

#preview {

margin-top: 20px;

max-width: 100%;

border: 1px solid #eee;

}

.param-set {

margin: 10px 0;

}

label {

display: inline-block;

width: 120px;

}

input {

padding: 4px;

width: 100px;

}

</style>

</head>

<body>

<div class="container">

<!-- 1. 选择本地图片 -->

<input style="width: 100%;" type="file" id="fileInput" accept="image/*">

<!-- 2. 设置目标参数:尺寸/压缩质量 -->

<div class="param-set">

<label>目标宽度(px):</label>

<input type="number" id="targetWidth" value="400" placeholder="如400">

<label>目标高度(px):</label>

<input type="number" id="targetHeight" value="400" placeholder="如400">

<label>压缩质量(0-1):</label>

<input type="number" id="quality" step="0.1" value="0.6" placeholder="如0.6">

<label>导出格式:</label>

<select id="formatSelect">

<option value="jpeg">JPEG (.jpg/.jpeg)</option>

<option value="png">PNG (.png)</option>

</select>

</div>

<!-- 3. 操作按钮 -->

<button class="btn" id="processBtn" disabled>处理图片</button>

<button class="btn" id="downloadBtn" disabled>下载处理后的图片</button>

<!-- 4. 预览处理后的图片 -->

<div>处理后预览:</div>

<img id="preview" alt="预览图">

</div>

<script>

// 获取DOM元素

const fileInput = document.getElementById('fileInput');

const processBtn = document.getElementById('processBtn');

const downloadBtn = document.getElementById('downloadBtn');

const preview = document.getElementById('preview');

preview.style.display = 'none';

const targetWidth = document.getElementById('targetWidth');

const targetHeight = document.getElementById('targetHeight');

const quality = document.getElementById('quality');

const formatSelect = document.getElementById('formatSelect');

let processedBlob = null; // 存储处理后的图片Blob(用于下载)

let currentFormat = 'jpeg'; // 默认格式

formatSelect.addEventListener('change', (e) => {

currentFormat = e.target.value;

console.log('当前格式:', currentFormat);

});

// 1. 选择图片后启用处理按钮

fileInput.addEventListener('change', (e) => {

if (e.target.files.length > 0) {

processBtn.disabled = false;

}

});

// 2. 核心:整体缩小图片(完整画面,等比例)

processBtn.addEventListener('click', async () => {

const file = fileInput.files[0];

if (!file) return;

// 读取原图并转为Image对象

const img = await loadImage(file);

// 创建Canvas

const canvas = document.createElement('canvas');

const ctx = canvas.getContext('2d');

// 计算等比例缩放后的尺寸(核心:只改宽度,高度自动适配,完整保留画面)

const originalWidth = img.width;

const originalHeight = img.height;

const newWidth = Number(targetWidth.value) || 400;

const newHeight = (originalHeight / originalWidth) * newWidth; // 等比例计算高度

// 设置Canvas尺寸为缩放后的尺寸

canvas.width = newWidth;

canvas.height = newHeight;

// 绘制图片:完整缩放,不裁剪(这一步是关键!)

ctx.drawImage(

img,

0, 0, originalWidth, originalHeight, // 原图完整区域

0, 0, newWidth, newHeight // Canvas完整区域(缩放后)

);

// 导出为Blob(压缩体积)

canvas.toBlob((blob) => {

processedBlob = blob;

// 预览缩小后的完整图片

const previewUrl = URL.createObjectURL(blob);

preview.src = previewUrl;

preview.style.display = 'block';

downloadBtn.disabled = false;

// 打印大小对比(验证)

console.log('处理前:', (file.size / 1024).toFixed(2), 'KB');

console.log('处理后:', (blob.size / 1024).toFixed(2), 'KB');

console.log('缩放后尺寸:', newWidth + 'x' + newHeight);

}, currentFormat == 'png' ? 'image/png' : 'image/jpeg', Number(quality.value) || 0.6);

});

// 3. 下载处理后的图片

downloadBtn.addEventListener('click', () => {

if (!processedBlob) return;

const url = URL.createObjectURL(processedBlob);

const a = document.createElement('a');

a.href = url;

a.download = `processed-${Date.now()}.${currentFormat}`; // 下载文件名

a.click();

// 释放URL资源

URL.revokeObjectURL(url);

});

// 辅助函数:读取文件并转为Image对象

function loadImage(file) {

return new Promise((resolve) => {

const reader = new FileReader();

reader.onload = (e) => {

const img = new Image();

img.onload = () => resolve(img);

img.src = e.target.result;

};

reader.readAsDataURL(file);

});

}

</script>

</body>

</html>

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/13 8:36:00

2026毕设ssm+vue基于框架的校园外卖平台的研究与搭建论文+程序

本系统&#xff08;程序源码&#xff09;带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、选题背景 关于“动漫文化线上社区”的研究&#xff0c;现有成果多以泛娱乐社交平台或单纯内容分发为主&#xff0c;专门针对“动漫图文…

作者头像 李华
网站建设 2026/4/5 7:45:13

从零搭建智能产品技术文档:让技术写作效率提升的秘密武器

在数字化转型的浪潮中&#xff0c;产品技术文档已成为企业核心竞争力的重要组成部分。然而&#xff0c;传统文档管理方式正面临前所未有的挑战——根据2025年最新调研数据显示&#xff0c;超过78%的技术团队仍在为文档管理效率低下而苦恼&#xff0c;平均每位工程师每周要花费6…

作者头像 李华
网站建设 2026/4/14 0:43:19

腐烂的橘子- python-多元bfs

题目&#xff1a;思路&#xff1a;统计新鲜橘子的数量&#xff0c;记录腐烂橘子的位置&#xff08;多源 BFS 起点&#xff09;逐层扩散&#xff08;每一层对应 1 分钟&#xff09;&#xff0c;每次扩散将相邻新鲜橘子腐烂最终若仍有新鲜橘子未腐烂&#xff0c;返回 -1&#xff…

作者头像 李华
网站建设 2026/4/15 15:26:28

EmotiVoice语音合成API限流策略:保护服务器稳定运行

EmotiVoice语音合成API限流策略&#xff1a;保护服务器稳定运行 在AI驱动的语音交互时代&#xff0c;越来越多的应用开始集成高质量的文本转语音&#xff08;TTS&#xff09;能力。从智能客服到虚拟主播&#xff0c;从有声书平台到个性化教育工具&#xff0c;用户对“自然、有情…

作者头像 李华
网站建设 2026/4/15 13:41:50

确认了,“国补”不会结束!但有大调整

我们的ChatGPT-Plus镜像站升级了&#xff01;同时享受多个AI系统&#xff1a;除了ChatGPT-5.2 还有 Claude Pro 以及 Midjourney 。官方会员账号一模一样的功能。还接入了多个热门模型 DeepSeek R1Grok3Gemini pro 。有需要的同学&#xff0c;可以戳&#x1f449; 重磅&#xf…

作者头像 李华