如何使用PIL将正方形图片转换为横版或竖版模式
使用PIL库将正方形图片转为横版/竖版的实现方法
情况1:仅旋转方向(保持正方形尺寸)
如果只是想改变图片的摆放方向(比如把“横放”的正方形转成“竖放”的正方形),用transpose方法旋转90/270度就行——因为原图是正方形,旋转后尺寸不变,只是方向翻转:
from PIL import Image # 加载你的正方形图片 img = Image.open("square_img.png") # 顺时针旋转90度,得到竖放的正方形 vertical_square = img.transpose(Image.Transpose.ROTATE_90) vertical_square.save("vertical_square.png") # 逆时针旋转90度(等价于顺时针270度),或者旋转180度翻转 horizontal_flipped = img.transpose(Image.Transpose.ROTATE_180) horizontal_flipped.save("horizontal_flipped.png")
情况2:生成不同比例的横版/竖版(非正方形)
如果需要生成宽大于高的横版(比如16:9)或高大于宽的竖版(比如9:16),可以通过创建新画布粘贴原图,或者裁剪原图部分区域来实现。
方法1:添加背景生成横/竖版
生成横版图片(宽>高)
以16:9比例为例,创建对应尺寸的画布,把原正方形居中粘贴:
from PIL import Image img = Image.open("square_img.png") square_side = img.size[0] # 正方形的边长 # 设定横版比例(这里用16:9) ratio = 16 / 9 # 画布高度和原正方形一致,宽度按比例计算 canvas_w = int(square_side * ratio) canvas_h = square_side # 创建白色背景画布(颜色可自定义,比如(0,0,0)为黑色) horizontal_canvas = Image.new("RGB", (canvas_w, canvas_h), (255, 255, 255)) # 计算居中粘贴的位置 paste_x = (canvas_w - square_side) // 2 paste_y = 0 # 把原图贴到画布上 horizontal_canvas.paste(img, (paste_x, paste_y)) horizontal_canvas.save("horizontal_version.png")
生成竖版图片(高>宽)
以9:16比例为例:
from PIL import Image img = Image.open("square_img.png") square_side = img.size[0] # 设定竖版比例(9:16) ratio = 9 / 16 # 画布宽度和原正方形一致,高度按比例计算 canvas_w = square_side canvas_h = int(square_side / ratio) # 创建背景画布 vertical_canvas = Image.new("RGB", (canvas_w, canvas_h), (255, 255, 255)) # 计算居中粘贴位置 paste_x = 0 paste_y = (canvas_h - square_side) // 2 vertical_canvas.paste(img, (paste_x, paste_y)) vertical_canvas.save("vertical_version.png")
方法2:裁剪原图生成横/竖版
如果不想添加背景,直接从正方形里裁出对应比例的区域:
裁剪横版
from PIL import Image img = Image.open("square_img.png") square_side = img.size[0] # 目标横版比例16:9 ratio = 16 / 9 crop_h = int(square_side / ratio) # 裁剪区域格式:(左, 上, 右, 下),取居中部分 crop_box = (0, (square_side - crop_h) // 2, square_side, (square_side + crop_h) // 2) cropped_horizontal = img.crop(crop_box) cropped_horizontal.save("cropped_horizontal.png")
裁剪竖版
from PIL import Image img = Image.open("square_img.png") square_side = img.size[0] # 目标竖版比例9:16 ratio = 9 / 16 crop_w = int(square_side * ratio) # 居中裁剪区域 crop_box = ((square_side - crop_w) // 2, 0, (square_side + crop_w) // 2, square_side) cropped_vertical = img.crop(crop_box) cropped_vertical.save("cropped_vertical.png")
内容的提问来源于stack exchange,提问作者Danish Ejaz
相关产品推荐
相关产品推荐

