news 2026/9/22 6:34:00

原生图片大小编辑

作者头像

张小明

前端开发工程师

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/9/22 0:18:48

欧姆龙 FINS ⇌ 西门子 S7 智能数据交换网关

Omron & Siemens PLC Data Exchange Smart Gateway点赞评论留言&#xff08;留下邮箱&#xff09;或者私信获取试用版&#x1f4a1; 产品核心价值“打破品牌壁垒&#xff0c;无需编程&#xff0c;一根网线实现欧姆龙与西门子 PLC 的互联互通。” 本软件旨在解决工业现场最常…

作者头像 李华
网站建设 2026/9/21 9:44:29

租打印机哪家好

探秘打印机租赁&#xff1a;如何选择可靠的合作伙伴&#xff1f;"看似省钱的购买&#xff0c;实则是最大的浪费。"在设备快速迭代的今天&#xff0c;企业办公设备的选择已经从单纯购买转向了更灵活的租赁模式。打印机租赁的市场现状与价值分析近年来&#xff0c;办公…

作者头像 李华
网站建设 2026/9/21 10:27:43

CANN TIK数据搬运GM到UB高性能优化实战

历经多年异构计算研发&#xff0c;我深刻体会到&#xff1a;"数据搬运是算子性能的隐形杀手&#xff0c;而非计算本身"。本文将带你穿透CANN的七层架构&#xff0c;直抵达芬奇核心的物理本质&#xff0c;掌握从TIK数据搬运到UB计算的全链路实战技能。 目录 &#x1…

作者头像 李华
网站建设 2026/9/21 22:05:37

在线监测:筑牢风电并网安全与效能的核心防线

在“双碳”目标驱动下&#xff0c;我国风电装机容量已突破4亿千瓦&#xff0c;新能源渗透率持续攀升。随之而来的核心挑战是&#xff1a;如何确保大规模、间歇性风电安全、稳定、高质量地并入电网&#xff1f;随着国家能源局对并网技术标准提出更严苛的要求&#xff0c;在线监测…

作者头像 李华
网站建设 2026/9/22 1:18:46

2026毕设ssm+vue基于框架的问答平台论文+程序

本系统&#xff08;程序源码&#xff09;带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容———————— 选题背景&#xff08;≈260字&#xff09; 关于动漫内容聚合与知识分享问题的研究&#xff0c;现有研究主要以短视频平台…

作者头像 李华