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

如何迭代旋转图像局部区域并合并所有旋转后的区域?

问题描述

目标

我想要旋转图像的蒙版区域。例如,若有一个内半径30、外半径50的圆形蒙版,我希望将蒙版区域旋转一定角度后叠加到原图上。但我需要使用不断缩小的圆形蒙版,并对应不同的旋转角度——比如要实现图像中心扭曲效果,就需要让半径越小的圆形区域旋转角度越大。

现有代码

from PIL import Image, ImageDraw, ImageFilter
import numpy
im1 = Image.open('lena.jpg')
im2 = Image.open('lena.jpg').resize(im1.size)
# Giving The Original image Directory 
# Specified 
Original_Image = Image.open('lena.jpg') 


# This Will Rotate Image By 60 Degree 


for i in numpy.arange(0,10,0.5):
    mask = Image.new("L", im1.size, 0)
    draw = ImageDraw.Draw(mask)
    rotated_image3 = Original_Image.rotate(18*i) 
    draw.ellipse((144+i-5, 54+i-5, 256-i+5, 166-i+5), fill=255)
    draw.ellipse((140+i, 50+i, 260-i, 170-i), fill=0)

    im = Image.composite(rotated_image3, im2, mask)
im.show()

遇到的问题

运行上述代码后,图像仅显示最后一个旋转区域。我该如何修改代码,将迭代过程中所有选中区域的旋转效果合并到同一张图像中?


解决方案

问题核心是每次循环都基于原始图像im2做合成,导致前一次的旋转效果被覆盖,只保留最后一次结果。要叠加所有效果,需要把每次合成后的图像作为下一次合成的基础。

修改后的代码:

from PIL import Image, ImageDraw
import numpy

# 仅加载一次原图,避免重复IO操作
Original_Image = Image.open('lena.jpg')
# 初始化结果图像为原图副本,后续所有修改都基于此
result_im = Original_Image.copy()

for i in numpy.arange(0, 10, 0.5):
    mask = Image.new("L", Original_Image.size, 0)
    draw = ImageDraw.Draw(mask)
    # 生成对应旋转角度的图像
    rotated_image = Original_Image.rotate(18 * i)
    # 绘制环形蒙版:外层填充白色,内层挖空
    draw.ellipse((144+i-5, 54+i-5, 256-i+5, 166-i+5), fill=255)
    draw.ellipse((140+i, 50+i, 260-i, 170-i), fill=0)
    
    # 关键:用当前结果图像作为合成背景,叠加新的旋转效果
    result_im = Image.composite(rotated_image, result_im, mask)

result_im.show()

修改说明

  • 复用结果图像:将result_im初始化为原图副本,每次合成后更新它,确保所有旋转效果依次叠加。
  • 优化资源加载:只打开一次原图,提升运行效率。
  • 保留原有蒙版逻辑:蒙版绘制方式不变,仅调整合成的目标图像,保证效果符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 10:31:22