下面给你一个 基于 HTML5 Canvas 实现“图片旋转 + 下载””的完整可运行示例代码,包含:
✔ 图片上传
✔ Canvas 绘制图片
✔ 旋转 90° / 180° / 270°
✔ 自由输入角度旋转
✔ 下载旋转后的图片
✔ 纯 HTML5 + 原生 JS,无需任何库
复制即可直接运行,非常适合移动端或 Web 项目。
⭐ 完整代码(HTML + CSS + JavaScript 一体)
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Canvas 图片旋转与下载 Demo</title>
<style>
body {
font-family: Arial, sans-serif;
padding: 12px;
background: #f3f3f3;
}
.box {
background: #fff;
padding: 15px;
border-radius: 10px;
box-shadow: 0 2px 10px rgba(0,0,0,.1);
}
canvas {
max-width: 100%;
margin-top: 15px;
background: #eee;
border-radius: 6px;
}
button {
margin: 5px 5px 5px 0;
padding: 8px 16px;
border: none;
border-radius: 6px;
background: #007bff;
color: #fff;
}
input[type='number'] {
width: 80px;
padding: 6px;
border-radius: 6px;
border: 1px solid #aaa;
}
</style>
</head>
<body>
<h2>Canvas 图片旋转与下载示例</h2>
<div class="box">
<input type="file" id="upload" accept="image/*">
<br>
<button onclick="rotate(90)">旋转 90°</button>
<button onclick="rotate(180)">旋转 180°</button>
<button onclick="rotate(270)">旋转 270°</button>
<br>
<input id="angleInput" type="number" value="45">
<button onclick="rotateCustom()">自定义角度旋转</button>
<br>
<button onclick="downloadImage()">下载旋转后的图片</button>
</div>
<canvas id="canvas"></canvas>
<script>
const upload = document.getElementById("upload");
const canvas = document.getElementById("canvas");
const ctx = canvas.getContext("2d");
let img = new Image();
let currentAngle = 0;
// 上传图片
upload.onchange = function (e) {
const file = e.target.files[0];
if (file) {
const reader = new FileReader();
reader.onload = function (evt) {
img.src = evt.target.result;
};
reader.readAsDataURL(file);
}
};
// 图片加载完成后绘制
img.onload = function () {
drawImage();
};
// 绘制图片(带旋转)
function drawImage() {
const angleInRad = currentAngle * Math.PI / 180;
// 旋转后图片的宽高重新计算
const width = img.width;
const height = img.height;
// 旋转 90° / 270° 时宽高对调
const cw = Math.abs(Math.cos(angleInRad)) * width + Math.abs(Math.sin(angleInRad)) * height;
const ch = Math.abs(Math.sin(angleInRad)) * width + Math.abs(Math.cos(angleInRad)) * height;
canvas.width = cw;
canvas.height = ch;
ctx.clearRect(0, 0, cw, ch);
ctx.save();
// 移动 canvas 原点到中心
ctx.translate(cw / 2, ch / 2);
// 旋转画布
ctx.rotate(angleInRad);
// 绘制图片(让图片中心对齐)
ctx.drawImage(img, -width / 2, -height / 2);
ctx.restore();
}
// 按钮旋转
function rotate(angle) {
currentAngle = (currentAngle + angle) % 360;
drawImage();
}
// 自定义角度旋转
function rotateCustom() {
const angle = parseFloat(document.getElementById("angleInput").value) || 0;
currentAngle = (currentAngle + angle) % 360;
drawImage();
}
// 下载图片
function downloadImage() {
const link = document.createElement("a");
link.download = "rotated_image.png";
link.href = canvas.toDataURL("image/png");
link.click();
}
</script>
</body>
</html>
📌 功能点说明
| 功能 | 已实现 |
|---|---|
| 上传图片 | ✔ |
| Canvas 绘图 | ✔ |
| 自由旋转图片 | ✔ |
| 图片宽高自适应 | ✔ |
| 按钮旋转 90/180/270 | ✔ |
| 自定义角度旋转 | ✔ |
| 下载旋转后图片 | ✔ |
只要告诉我需要哪个版本,我马上写给你!
发表回复