自己动手做在线图片压缩工具

图片压缩在节省存储空间、加快加载速度、降低带宽消耗、提升处理效率、便于分享和传输、保护隐私和安全以及适应不同设备等方面都发挥着重要作用。

1、效果预览

在这里插入图片描述

2、HTML

创建 index.html 文件

<!DOCTYPE html>
<html lang="zh-CN">

	<head>
		<meta charset="UTF-8">
		<meta name="viewport" content="width=device-width, initial-scale=1.0">
		<title>图片压缩工具</title>
		<link rel="stylesheet" href="css/index.css">
	</head>

	<body>
		<!-- 主容器 -->
		<div class="container">
			<!-- 标题区域 -->
			<header>
				<h1>图片压缩工具</h1>
				<p>简单、高效的图片压缩服务</p>
			</header>
			<!-- 上传区域 -->
			<div class="upload-area">
				<input type="file" id="fileInput" accept="image/png, image/jpeg" hidden>
				<div class="upload-box" id="uploadArea">
					<img src="img/svg/upload.svg" alt="上传图标" class="upload-icon">
					<p>点击或拖拽图片到这里</p>
					<p class="support-text">支持 PNG、JPG 格式</p>
				</div>
			</div>
			<!-- 预览和压缩区域 -->
			<div class="preview-container" id="previewContainer" style="display: none;">
				<div class="image-comparison">
					<!-- 原图预览 -->
					<div class="preview-box">
						<h3>原图</h3>
						<div class="image-wrapper">
							<img id="originalImage" alt="原图预览"> </div>
						<div class="image-info">
							<span>文件大小:</span>
							<span id="originalSize">0 KB</span>
						</div>
					</div>
					<!-- 压缩图预览 -->
					<div class="preview-box">
						<h3>压缩后</h3>
						<div class="image-wrapper">
							<img id="compressedImage" alt="压缩后预览"> </div>
						<div class="image-info">
							<span>文件大小:</span>
							<span id="compressedSize">0 KB</span>
						</div>
					</div>
				</div>
				<!-- 压缩控制区域 -->
				<div class="compression-controls">
					<div class="quality-control">
						<label for="qualitySlider">压缩质量:
							<span id="qualityValue">50%</span>
							
						</label>
						<input type="range" id="qualitySlider" min="0" max="100" value="50">
					</div>
					<button id="downloadBtn" class="download-btn">下载压缩后的图片</button>
				</div>
			</div>
		</div>
		<script src="js/index.js"></script>
	</body>

</html>

3、CSS

创建 index.css 文件

/* 全局样式重置 */

* {
	margin: 0;
	padding: 0;
	box-sizing: border-box;
}


/* 基础样式 */

body {
	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
	background-color: #f5f5f7;
	color: #1d1d1f;
	line-height: 1.5;
}


/* 容器样式 */

.container {
	max-width: 1200px;
	margin: 0 auto;
	padding: 2rem;
}


/* 标题区域 */

header {
	text-align: center;
	margin-bottom: 3rem;
}

header h1 {
	font-size: 2.5rem;
	font-weight: 600;
	margin-bottom: 0.5rem;
}

header p {
	color: #86868b;
	font-size: 1.1rem;
}


/* 上传区域样式 */

.upload-area {
	background-color: white;
	border-radius: 1rem;
	padding: 2rem;
	text-align: center;
	margin-bottom: 2rem;
	box-shadow: 0 2px 12px rgba(0, 0, 0, 0.08);
	transition: all 0.3s ease;
}

.upload-box {
	border: 2px dashed #d2d2d7;
	border-radius: 0.8rem;
	padding: 2rem;
	cursor: pointer;
	transition: all 0.3s ease;
}

.upload-box:hover {
	border-color: #0071e3;
	background-color: #f5f5f7;
}

.upload-icon {
	width: 64px;
	height: 64px;
	margin-bottom: 1rem;
}

.support-text {
	color: #86868b;
	font-size: 0.9rem;
	margin-top: 0.5rem;
}


/* 预览区域样式 */

.preview-container {
	background-color: white;
	border-radius: 1rem;
	padding: 2rem;
	box-shadow: 0 2px 12px rgba(0, 0, 0, 0.08);
}

.image-comparison {
	display: flex;
	gap: 2rem;
	margin-bottom: 2rem;
}

.preview-box {
	flex: 1;
}

.preview-box h3 {
	margin-bottom: 1rem;
	font-weight: 500;
}

.image-wrapper {
	border-radius: 0.8rem;
	overflow: hidden;
	background-color: #f5f5f7;
}

.image-wrapper img {
	width: 100%;
	height: auto;
	display: block;
}

.image-info {
	margin-top: 1rem;
	color: #86868b;
}


/* 压缩控制区域 */

.compression-controls {
	padding-top: 1.5rem;
	border-top: 1px solid #d2d2d7;
}

.quality-control {
	margin-bottom: 1.5rem;
}

.quality-control label {
	display: block;
	margin-bottom: 0.5rem;
}

input[type="range"] {
	width: 100%;
	height: 4px;
	background: #d2d2d7;
	border-radius: 2px;
	-webkit-appearance: none;
}

input[type="range"]::-webkit-slider-thumb {
	-webkit-appearance: none;
	width: 20px;
	height: 20px;
	background: #0071e3;
	border-radius: 50%;
	cursor: pointer;
}

.download-btn {
	background-color: #0071e3;
	color: white;
	border: none;
	border-radius: 0.8rem;
	padding: 0.8rem 2rem;
	font-size: 1rem;
	cursor: pointer;
	transition: all 0.3s ease;
}

.download-btn:hover {
	background-color: #0077ed;
}


/* 响应式设计 */

@media (max-width: 768px) {
	.image-comparison {
		flex-direction: column;
	}
	.container {
		padding: 1rem;
	}
}

4、JavaScript

创建 index.js 文件

// 获取DOM元素
const uploadArea = document.getElementById('uploadArea');
const fileInput = document.getElementById('fileInput');
const previewContainer = document.getElementById('previewContainer');
const originalImage = document.getElementById('originalImage');
const compressedImage = document.getElementById('compressedImage');
const originalSize = document.getElementById('originalSize');
const compressedSize = document.getElementById('compressedSize');
const qualitySlider = document.getElementById('qualitySlider');
const qualityValue = document.getElementById('qualityValue');
const downloadBtn = document.getElementById('downloadBtn');
// 上传区域点击事件
uploadArea.addEventListener('click', () => {
	fileInput.click();
});
// 处理文件拖放
uploadArea.addEventListener('dragover', (e) => {
	e.preventDefault();
	uploadArea.style.borderColor = '#0071e3';
});
uploadArea.addEventListener('dragleave', (e) => {
	e.preventDefault();
	uploadArea.style.borderColor = '#d2d2d7';
});
uploadArea.addEventListener('drop', (e) => {
	e.preventDefault();
	uploadArea.style.borderColor = '#d2d2d7';
	const file = e.dataTransfer.files[0];
	if(file && file.type.match('image.*')) {
		processImage(file);
	}
});
// 文件选择处理
fileInput.addEventListener('change', (e) => {
	const file = e.target.files[0];
	if(file) {
		processImage(file);
	}
});
// 处理图片
function processImage(file) {
	// 显示原始文件大小    
	originalSize.textContent = formatFileSize(file.size);
	// 创建文件预览  
	const reader = new FileReader();
	reader.onload = (e) => {
		originalImage.src = e.target.result;
		compressImage(e.target.result);
		previewContainer.style.display = 'block';
	};
	reader.readAsDataURL(file);
}
// 压缩图片
function compressImage(dataUrl) {
	const img = new Image();
	img.onload = () => {
		const canvas = document.createElement('canvas');
		const ctx = canvas.getContext('2d');
		canvas.width = img.width;
		canvas.height = img.height;
		ctx.drawImage(img, 0, 0);
		const quality = qualitySlider.value / 100;
		const compressedDataUrl = canvas.toDataURL('image/jpeg', quality);
		compressedImage.src = compressedDataUrl;
		// 计算压缩后的大小      
		const compressedSize = Math.round((compressedDataUrl.length * 3) / 4);
		document.getElementById('compressedSize').textContent = formatFileSize(compressedSize);
	};
	img.src = dataUrl;
}
// 质量滑块变化事件
qualitySlider.addEventListener('input', (e) => {
	qualityValue.textContent = e.target.value + '%';
	if(originalImage.src) {
		compressImage(originalImage.src);
	}
});
// 下载按钮点击事件
downloadBtn.addEventListener('click', () => {
	const link = document.createElement('a');
	link.download = 'compressed-image.jpg';
	link.href = compressedImage.src;
	link.click();
});
// 文件大小格式化
function formatFileSize(bytes) {
	if(bytes === 0) return '0 Bytes';
	const k = 1024;
	const sizes = ['Bytes', 'KB', 'MB', 'GB'];
	const i = Math.floor(Math.log(bytes) / Math.log(k));
	return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
}

使用原生的 html、css、js 技术实现了一个简单的图片压缩工具。

如您在阅读中发现不足,欢迎留言!!!

名称:小游戏网全站html修正版(带3.9万个游戏数据+采集) 演示:game.wuhan.cc www.dincoo.cn 后台:admin/admin_login.asp 管理员和密码都是:admin 程序:内核新云四博2008版 数据库:ACC 网站数据库:database/#newasp.mdb 采集数据库:database/#collection.asa 2008/05/06 公告: 1.本程序中的数据库已经升级到39624个,以后每增加10000个小游戏即提供一次更新数据库(只需导入NC_Classify和NC_FlashList即可),新消息将在后台发布公告. 2.修改了后台的管理快捷连接 3.删除了部分没有用的垃圾文件和图片 4.修改了"成人"栏目名称及删除了近200个不雅观的游戏 2008/05/01 安装游戏程序: 1.解压 2.首页的幻灯FLASH在xyx.xml里面修改 3.首页的部分调用:基本设置->站点代码广告管理 {$siteAdsCode1}、{$siteAdsCode2}、{$siteAdsCode3}三项 4.游戏的缩图和swf文件均为gamg.wuhan.cc的连接,请放心使用! 5.你可以在后台选择是否生成html(生成后约需要650M,如果空间不宽裕,可以一直连接wuhan.cc资源) 6、头部和底部代码修改:后台 -> 动画频道模板管理 -> 自定义标签 7、全站广告在adfile里面修改js和htm文件即可全站修改 8、网站页面的修改在:后台 -> 动画频道模板管理 10、建议使用game.youname.com这样的二级域名,上传即可使用。如果你想使用www.youname.com/game请在后台修改模板和标签(这个问题请不要联系我!)。 11、播放页面的“下载”是迅雷ID,你可以在后台:动画频道模板管理 -> 动画频道信息页面模板,里面修改,想加入迅雷赚钱请联系 QQ:31004725 迅雷[阿龙] 技术支持:QQ:704544297 升级支持:http://game.wuhan.cc/down.asp
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Asurplus

学如逆水行舟,不进则退

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值