图片旋转
90/180/270 度 / 任意角度 · 自动调整画布
90/180/270/任意角度
90/180/270 度 / 任意角度 · 自动调整画布
了解工具定位 · 使用场景 · 对比优势
选择预设的 90°/180°/270° 或输入任意角度,即可旋转图片。电商处理商品图、设计师调整素材方向、摄影师校正水平线,无需安装软件。图片处理全程在浏览器本地完成,不上传任何数据。
手机拍摄时经常因为手持角度偏差产生歪斜照片,尤其拍文档、白板、建筑时,歪斜的图片影响阅读和打印效果。使用本工具,上传照片后选择 90°/180°/270° 或手动输入任意角度,一键旋转至水平,无需专业修图软件,浏览器内直接完成,照片保持原始画质。
电商运营者从不同供应商获取的商品图方向不一,有的横拍、有的竖拍,上架前需要统一方向。本工具支持 90/180/270 度快速旋转,无需打开 Photoshop 逐张调整,在网页中即可批量旋转图片,节省大量重复操作时间。
设计师从素材库下载的图标、纹理、背景图方向可能与当前版面不匹配,需要旋转 15° 或 45° 等非标准角度来适配构图。本工具支持任意角度(0-360°)精确旋转,输入具体度数即可微调,旋转后图片边缘自动补白,保持完整画布。
办公人员使用扫描仪或多功能一体机扫描文件时,偶尔因进纸方向错误导致生成的 PDF 或图片颠倒(180° 旋转)。使用本工具,上传扫描件后点击一次 180° 旋转即可恢复正向,无需重新扫描,尤其适合批量处理多页合同或发票。
维修工程师在手机或平板上查看设备电路图、零件分解图时,原图方向可能与当前设备摆放方向不一致,频繁扭头查看影响效率。使用本工具将图纸旋转 90° 或 270° 至与实物方向一致,边看边操作,减少误判。
| 维度 | 本工具 | 竞品 A (imageresizer.com) | 传统方法 (Photoshop / GIMP) |
|---|---|---|---|
| 数据隐私 | 纯浏览器处理,文件不上传服务器 | 上传文件到云端处理 | 本地软件处理,不涉及网络传输 |
| 处理速度 | 1 秒内完成,即时预览 | 取决于文件大小和网络,通常 3-10 秒 | 打开软件、导入、旋转、导出,至少 1-2 分钟 |
| 操作步骤 | 进入页面 → 选择图片 → 点击旋转 → 下载 | 进入页面 → 上传 → 等待处理 → 下载 | 打开软件 → 创建/打开文件 → 选择旋转工具 → 设置角度 → 导出 |
| 离线可用 | 完全离线,加载后断网也可用 | 必须联网 | 完全离线 |
| 批量处理 | 单张处理 | 支持批量上传和旋转 | 可通过动作/脚本批量处理 |
| 文件大小限制 | 无限制(取决于浏览器内存) | 通常有 20-50MB 限制 | 无限制 |
| 收费 | 完全免费,无水印 | 免费版有水印,去水印需付费 | 正版软件需付费购买 |
上手步骤 · 输入输出 · 避坑提示
| 输入 | 输出 | 说明 |
|---|---|---|
| 上传一张 1920×1080 的 JPG 图片,选择 90° 旋转 | 输出一张 1080×1920 的 JPG 图片,顺时针旋转 90° | 典型场景:将横屏照片转为竖屏 |
| 上传一张 800×600 的 PNG 图片,选择 180° 旋转 | 输出一张 800×600 的 PNG 图片,上下颠倒 | 典型场景:修正倒置的扫描件或自拍 |
| 上传一张 4000×3000 的 HEIC 图片,选择 270° 旋转 | 输出一张 3000×4000 的 HEIC 图片,逆时针旋转 90° | 典型场景:iPhone 拍摄的 HEIC 格式照片 |
| 上传一张 100×100 的正方形 GIF 动图,选择 45° 任意角度 | 输出一张 100×100 的 GIF 动图,内容旋转 45°,画布自动裁剪为正方形 | 边界 case:正方形图片与动图格式同时处理 |
| 上传一张 1×1 像素的 BMP 图片,选择 90° 旋转 | 输出一张 1×1 像素的 BMP 图片,内容不变 | 边界 case:极低分辨率图片(1×1 像素) |
| 上传一张 50000×50000 像素的 TIFF 图片,选择 180° 旋转 | 输出一张 50000×50000 像素的 TIFF 图片,浏览器可能因内存不足卡顿 | 边界 case:超大分辨率图片(接近浏览器处理上限) |
| 上传一张带透明通道的 500×500 PNG 图片,选择 90° 旋转 | 输出一张 500×500 的 PNG 图片,透明通道保留,内容旋转 90° | 易错 case:用户担心旋转会丢失透明背景 |
| 上传一张 300×400 的 WebP 图片,选择 0°(不旋转) | 输出原图,无任何变化 | 易错 case:用户误以为需要点击旋转按钮才能下载 |
上传一个 .pdf 或 .docx 文件到工具上传 .jpg、.png、.webp、.gif、.bmp 等标准图片格式浏览器 File API 的 createImageBitmap 只支持图片 MIME 类型;非图片文件会触发 DOMException 或静默失败,无输出
输入角度 0 或 360,期望得到不同结果需要旋转时输入 90 / 180 / 270;不需要旋转时直接下载原图0° 和 360° 旋转输出与输入完全一致,徒增一次浏览器重绘开销(Canvas 渲染 + 编码),无实际用途
在角度输入框填写 -90输入 270(等价于 -90 的顺时针旋转),或使用 90 / 180 / 270 预设按钮Canvas 的 rotate() 接受弧度,但本工具只处理 0-360 正整数;负角度会被 Math.abs 或取模处理,结果可能非预期
输入 45.5° 或 90.3°输入 45 或 90 等整数角度工具预设按钮只覆盖 90 的倍数,手动输入框若未做浮点校验,45.5 会被 parseInt 截断为 45,丢失精度
旋转 45° 后图片四角被切掉,以为是工具 bug使用 90/180/270 预设按钮(不会裁剪),或手动输入角度前确认工具是否提供「自适应画布」选项Canvas 默认画布尺寸固定,旋转非直角角度时原图超出画布边界会被裁剪;本工具仅支持 90 倍数旋转,不会出现此问题
上传 8000×6000 像素的 RAW 转存 JPG(约 20MB)上传前用本地软件压缩至 4000px 以内,或使用 WebP 格式减小体积Canvas 操作在浏览器主线程执行,超大图片解码 + 旋转 + 编码会占用数百 MB 内存,低端设备可能 OOM 或标签页崩溃
旋转一张手机竖拍照片(EXIF Orientation=6),输出仍是横图旋转前先用 EXIF 查看工具确认 Orientation 值,或使用支持 EXIF 修正的图片编辑器本工具仅做像素级旋转,不读取/写入 EXIF 元数据;Orientation 标签不会被改写,浏览器显示可能仍依赖 EXIF 方向
上传 PNG 透明图,旋转后下载为 JPG(白色背景填充透明区域)上传 PNG 时确认输出格式也为 PNG,或接受 JPG 会丢失透明通道Canvas.toBlob() 默认输出格式由工具指定,若固定为 image/jpeg,PNG 的 alpha 通道会被丢弃,透明区域变白
输入 180° 试图实现水平镜像(左右颠倒)使用专门的「镜像翻转」工具,或 CSS transform: scaleX(-1)旋转 180° 是上下+左右同时颠倒,与镜像翻转(仅水平或垂直翻转)不同;两者视觉结果完全不同
公式推导 · 流程图解 · 依据出处
x' = x cos θ - y sin θ, y' = x sin θ + y cos θ
x, y — 原始像素坐标(整数)x', y' — 旋转后像素坐标(浮点)θ — 旋转角度(弧度,逆时针为正)对 100×200 图片逆时针旋转 30°(θ=π/6≈0.5236)。取中心点附近像素 (50, 80):x'=50×0.8660 - 80×0.5≈43.3 - 40=3.3,y'=50×0.5 + 80×0.8660≈25 + 69.28=94.28。新坐标 (3.3, 94.28) 需经双线性插值取整到 (3, 94)。
适用于任意角度(0°~360°)的二维图像旋转,基于标准旋转矩阵。90°/180°/270° 为特例(cos/sin 为 0 或 ±1),无需插值。不适用于三维旋转或非欧几里得空间变换。
3 种主流语言 · 复制即用
from PIL import Image
# 打开图片
img = Image.open("input.jpg")
# 旋转 90 度(逆时针)
rotated = img.rotate(90, expand=True)
rotated.save("rotated_90.jpg")
# 旋转任意角度(45 度,不裁剪)
rotated_any = img.rotate(45, expand=True, fillcolor=(255, 255, 255))
rotated_any.save("rotated_45.jpg")
# 旋转 180 度(使用 transpose 更快)
rotated_180 = img.transpose(Image.ROTATE_180)
rotated_180.save("rotated_180.jpg")package main
import (
"image"
"image/jpeg"
"image/png"
"log"
"os"
"golang.org/x/image/draw"
)
func rotate90(src image.Image) *image.NRGBA {
// 创建旋转后的画布(宽高互换)
dst := image.NewNRGBA(image.Rect(0, 0, src.Bounds().Dy(), src.Bounds().Dx()))
for y := 0; y < src.Bounds().Dy(); y++ {
for x := 0; x < src.Bounds().Dx(); x++ {
dst.Set(src.Bounds().Dy()-1-y, x, src.At(x, y))
}
}
return dst
}
func main() {
file, err := os.Open("input.jpg")
if err != nil {
log.Fatal(err)
}
defer file.Close()
src, _, err := image.Decode(file)
if err != nil {
log.Fatal(err)
}
rotated := rotate90(src)
out, _ := os.Create("rotated.jpg")
defer out.Close()
jpeg.Encode(out, rotated, &jpeg.Options{Quality: 95})
}const sharp = require('sharp');
// 旋转 90 度并保存
sharp('input.jpg')
.rotate(90)
.toFile('rotated_90.jpg')
.catch(err => console.error('旋转失败:', err));
// 旋转任意角度(45 度,背景白色)
sharp('input.jpg')
.rotate(45, { background: { r: 255, g: 255, b: 255, alpha: 1 } })
.toFile('rotated_45.jpg')
.catch(err => console.error('旋转失败:', err));
// 使用 canvas API(浏览器环境)
const img = new Image();
img.onload = () => {
const canvas = document.createElement('canvas');
canvas.width = img.naturalHeight;
canvas.height = img.naturalWidth;
const ctx = canvas.getContext('2d');
ctx.translate(canvas.width / 2, canvas.height / 2);
ctx.rotate(Math.PI / 2);
ctx.drawImage(img, -img.naturalWidth / 2, -img.naturalHeight / 2);
canvas.toBlob(blob => {
const url = URL.createObjectURL(blob);
console.log('旋转后的图片 URL:', url);
});
};
img.src = 'input.jpg';9 个高频疑问