You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python PIL中实现无裁剪的负X倾斜变换?

解决PIL实现X倾斜变换时负因子导致的图像裁剪问题

你当前的代码在使用负skew_factor时出现裁剪,核心原因是:当因子为负时,x_offset = int(skew_factor * y)会生成负数偏移,原图像的部分像素会被映射到输出图像的负X坐标区域,这部分像素会被直接丢弃,从而出现裁剪。

以下是修复后的完整代码:

from PIL import Image

def x_skew_image(input_path, output_path, skew_factor):
    # 打开输入图像
    input_image = Image.open(input_path)
    width, height = input_image.size

    # 计算所有行的偏移量,找到最小的x_offset(负因子下会是负数)
    x_offsets = [int(skew_factor * y) for y in range(height)]
    min_offset = min(x_offsets)

    # 计算输出图像的宽度:原宽度 + 偏移量的最大差值(覆盖所有像素的范围)
    new_width = width + max(x_offsets) - min_offset
    output_image = Image.new("RGB", (new_width, height))

    # 应用倾斜变换,加入偏移补偿确保所有像素落在输出图像内
    for y in range(height):
        x_offset = x_offsets[y]
        # 补偿偏移:让最小的偏移量对应到输出图像的0坐标
        x_compensate = -min_offset
        for x in range(width):
            output_x = x + x_offset + x_compensate
            if 0 <= output_x < new_width:
                output_image.putpixel((output_x, y), input_image.getpixel((x, y)))

    output_image.save(output_path)

# 替换为你的路径和参数
input_path = r'input_path'
output_path = r'output_path'
skew_factor = -0.4  # 负因子也能正常工作

x_skew_image(input_path, output_path, skew_factor)

关键修改说明:

  • 先计算所有行的x_offset并找到最小偏移值:负因子场景下这个值是负数,代表原图像最左侧像素会被偏移到输出图像的负坐标区域
  • 调整输出图像宽度:确保能容纳所有偏移后的像素范围,不会出现边界截断
  • 增加偏移补偿值:把所有像素的X坐标偏移到输出图像的正区域内,彻底解决负因子导致的裁剪问题

内容的提问来源于stack exchange,提问作者kal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 01:32:11