当前位置: 首页 > news >正文

原生图片大小编辑

创建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>

http://www.cnnetsun.cn/news/101892.html

相关文章:

  • 欧姆龙 FINS ⇌ 西门子 S7 智能数据交换网关
  • 租打印机哪家好
  • CANN TIK数据搬运GM到UB高性能优化实战
  • (弓乙图)希言自然。飘风不终朝,骤雨不终日。孰为此者?是乃天地。然天地尚不能久,而况于人乎?
  • 在线监测:筑牢风电并网安全与效能的核心防线
  • 2026毕设ssm+vue基于框架的问答平台论文+程序
  • EmotiVoice语音合成服务健康检查机制
  • 告别机械音!EmotiVoice实现自然情感语音合成
  • 电机生产车间设备看板物联网方案
  • TPAMI 2025 | 图像超分新范式:LTPE 以局部纹理分布约束,兼顾视觉质量与参数效率
  • mysql建表后的数据填入
  • Observe · Secure · AI|观测云2025中国可观测日深圳站圆满收官
  • 基于SpringBoot的大学生科技竞赛管理系统(毕业设计项目源码+文档)
  • 基于SpringBoot的动漫分享系统的设计与实现(毕业设计项目源码+文档)
  • 震惊!这3家环保服务商靠谱到让你意想不到!
  • 微服务网格:Istio 流量管理实战
  • 电脑启动太慢怎么解决?从底层优化到专业电脑加速的5大终极策略
  • 我的新能源车企,如何靠六西格玛培训跑赢质量与成本的终极竞赛?
  • [创业之路]-734-没有权力的责任是奴役,没有责任的权力是腐败,没有利益的责任是忽悠。管得好,叫责权利统一;管不好,叫利权责倒挂。一流的组织:用责任牵引权力和利益;末流的组织:用利益和权力逃避责任
  • 基于SpringBoot的自动驾驶数据处理任务众包平台系统毕业设计项目源码
  • 基于SpringBoot的养老院管理系统毕业设计项目源码
  • 若是Windows下的HGDB配置参数work_mem>=2GB会导致HGDB服务无法启动
  • 17、使用psad应对网络攻击:原理、配置与实例
  • EmotiVoice能否替代真人配音?实测对比告诉你
  • EmotiVoice语音紧迫感调控适合警报通知
  • vue基于springboot的土壤监测信息采集系统
  • vue基于springboot的小区停车场收费车辆计费管理系统的设计与实现
  • vue基于springboot的文创产品商城众筹平台设计与实现
  • vue基于springboot的物流运输仓储仓库采购信息系统平台的设计与实现
  • 基于SpringBoot的民宿管理系统的设计与实现毕业设计项目源码