本文目录导读:

Python + Pillow (最常用)
from PIL import Image
def rotate_image(input_path, output_path, angle):
"""
旋转图片
:param input_path: 输入图片路径
:param output_path: 输出图片路径
:param angle: 旋转角度(顺时针)
"""
# 打开图片
img = Image.open(input_path)
# 旋转图片(expand=True 保持完整显示)
rotated = img.rotate(angle, expand=True)
# 保存图片
rotated.save(output_path)
# 使用示例
rotate_image("input.jpg", "output.jpg", 90) # 顺时针旋转90度
OpenCV 版本
import cv2
def rotate_image_opencv(input_path, output_path, angle):
"""
使用OpenCV旋转图片
"""
# 读取图片
img = cv2.imread(input_path)
height, width = img.shape[:2]
# 获取旋转矩阵
center = (width // 2, height // 2)
rotation_matrix = cv2.getRotationMatrix2D(center, angle, 1.0)
# 计算新的边界尺寸
cos = abs(rotation_matrix[0, 0])
sin = abs(rotation_matrix[0, 1])
new_width = int(height * sin + width * cos)
new_height = int(height * cos + width * sin)
# 调整旋转矩阵
rotation_matrix[0, 2] += new_width // 2 - center[0]
rotation_matrix[1, 2] += new_height // 2 - center[1]
# 执行旋转
rotated = cv2.warpAffine(img, rotation_matrix, (new_width, new_height))
# 保存图片
cv2.imwrite(output_path, rotated)
# 使用示例
rotate_image_opencv("input.jpg", "output.jpg", -45) # 逆时针旋转45度
批量处理脚本(支持多张图片)
import os
from PIL import Image
import glob
def batch_rotate_images(input_dir, output_dir, angle):
"""
批量旋转图片
:param input_dir: 输入目录
:param output_dir: 输出目录
:param angle: 旋转角度
"""
# 创建输出目录
if not os.path.exists(output_dir):
os.makedirs(output_dir)
# 支持多种图片格式
extensions = ['*.jpg', '*.jpeg', '*.png', '*.bmp', '*.tiff']
for ext in extensions:
for file_path in glob.glob(os.path.join(input_dir, ext)):
# 获取文件名
filename = os.path.basename(file_path)
output_path = os.path.join(output_dir, filename)
# 旋转并保存
try:
img = Image.open(file_path)
rotated = img.rotate(angle, expand=True)
rotated.save(output_path)
print(f"已处理: {filename}")
except Exception as e:
print(f"处理失败 {filename}: {str(e)}")
# 使用示例
batch_rotate_images("input_folder", "output_folder", 90)
交互式角度选择脚本
from PIL import Image
import tkinter as tk
from tkinter import filedialog, messagebox
class ImageRotator:
def __init__(self, root):
self.root = root
self.root.title("图片旋转工具")
self.root.geometry("300x200")
# 创建界面元素
self.label = tk.Label(root, text="选择角度:")
self.label.pack(pady=10)
self.angle_var = tk.StringVar(value="90")
self.angle_entry = tk.Entry(root, textvariable=self.angle_var, width=10)
self.angle_entry.pack()
self.select_btn = tk.Button(root, text="选择图片", command=self.select_and_rotate)
self.select_btn.pack(pady=20)
def select_and_rotate(self):
# 选择文件
file_path = filedialog.askopenfilename(
title="选择图片",
filetypes=[("图片文件", "*.jpg *.jpeg *.png *.bmp")]
)
if not file_path:
return
try:
# 获取角度
angle = float(self.angle_var.get())
# 旋转图片
img = Image.open(file_path)
rotated = img.rotate(angle, expand=True)
# 保存文件
save_path = filedialog.asksaveasfilename(
defaultextension=".jpg",
filetypes=[("JPEG", "*.jpg"), ("PNG", "*.png"), ("所有文件", "*.*")]
)
if save_path:
rotated.save(save_path)
messagebox.showinfo("成功", f"图片已保存到: {save_path}")
except ValueError:
messagebox.showerror("错误", "请输入有效的角度值")
except Exception as e:
messagebox.showerror("错误", f"处理失败: {str(e)}")
# 运行程序
if __name__ == "__main__":
root = tk.Tk()
app = ImageRotator(root)
root.mainloop()
命令行脚本(带参数)
#!/usr/bin/env python3
import argparse
from PIL import Image
def main():
parser = argparse.ArgumentParser(description='图片旋转工具')
parser.add_argument('input', help='输入图片路径')
parser.add_argument('output', help='输出图片路径')
parser.add_argument('-a', '--angle', type=float, required=True,
help='旋转角度(度)')
parser.add_argument('-e', '--expand', action='store_true',
help='扩展画布以显示完整图片')
args = parser.parse_args()
try:
img = Image.open(args.input)
rotated = img.rotate(args.angle, expand=args.expand)
rotated.save(args.output)
print(f"成功: 图片已旋转 {args.angle} 度")
except Exception as e:
print(f"错误: {str(e)}")
if __name__ == "__main__":
main()
安装依赖
# 安装 Pillow pip install Pillow # 安装 OpenCV(可选) pip install opencv-python
使用说明
- 基本使用:直接调用旋转函数
- 批量处理:使用
batch_rotate_images()函数 - 命令行使用:
python script.py input.jpg output.jpg -a 90 -e
- 交互式使用:运行带 GUI 的脚本
选择适合你需求的版本即可,如果是简单任务,推荐使用 Pillow 版本;如果需要更多图像处理功能,可以选择 OpenCV 版本。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播