仅旋转图像的一部分 Python

3

有人能告诉我如何像这样旋转图像的一部分吗:

this

如何找到该图像的坐标/中心点:

image

我可以使用以下方式旋转所有图片

from PIL import Image

def rotate_image():
img = Image.open("nime1.png")

img.rotate(45).save("plus45.png")
img.rotate(-45).save("minus45.png")

img.rotate(90).save("90.png")
img.transpose(Image.ROTATE_90).save("90_trans.png")

img.rotate(180).save("180.png")


if __name__ == '__main__':
rotate_image()

请尝试在您的问题中包含图片,而不是链接它。 - gowrath
完成了,这张图片 - Bagus Prasetyo W
制作图像的副本;裁剪您想旋转的所需区域,旋转它,并将其粘贴到原始图像中。这样可以行吗? - gowrath
我尝试使用这个答案,但是我遇到了错误:( - Bagus Prasetyo W
2个回答

1
你可以将图片的某一区域裁剪为一个新的变量。在这种情况下,我从原始图像中裁剪出一个120x120像素的框,并将其旋转90度后粘贴回原始图像。
from PIL import Image

img = Image.open('./image.jpg')
sub_image = img.crop(box=(200,0,320,120)).rotate(90)
img.paste(sub_image, box=(200,0))

enter image description here

所以我认真思考了一下,并编写了一个函数,在旋转之前对裁剪的图像应用一个圆形掩膜,这样可以避免出现奇怪的影响,从而实现任意角度旋转。

def circle_rotate(image, x, y, radius, degree):
    img_arr = numpy.asarray(image)
    box = (x-radius, y-radius, x+radius+1, y+radius+1)
    crop = image.crop(box=box)
    crop_arr = numpy.asarray(crop)
    # build the cirle mask
    mask = numpy.zeros((2*radius+1, 2*radius+1))
    for i in range(crop_arr.shape[0]):
        for j in range(crop_arr.shape[1]):
            if (i-radius)**2 + (j-radius)**2 <= radius**2:
                mask[i,j] = 1
    # create the new circular image
    sub_img_arr = numpy.empty(crop_arr.shape ,dtype='uint8')
    sub_img_arr[:,:,:3] = crop_arr[:,:,:3]
    sub_img_arr[:,:,3] = mask*255
    sub_img = Image.fromarray(sub_img_arr, "RGBA").rotate(degree)
    i2 = image.copy()
    i2.paste(sub_img, box[:2], sub_img.convert('RGBA'))
    return i2

i2 = circle_rotate(img, 260, 60, 60, 45)
i2

enter image description here


是的先生,操作成功了,但我无法保存新图片 :( - Bagus Prasetyo W
先生,为什么我使用circle_rotate尝试却没有成功? - Bagus Prasetyo W
您可以使用 i2.save('./new_image.jpg') 来保存图片。 - James
先生,我正在使用 SC 进行旋转,但是无法完成,出现了 i2 = circle_rotate(img, 260, 60, 60, 45) 的错误 :(如果我要使用 SC,那么输入图像的代码在哪里? - Bagus Prasetyo W

0

您可以这样解决这个问题。假设您有 img = Image.open("nime1.png")

  1. 使用 img2 = img.copy() 创建图像的副本
  2. 使用 img2.crop() 在所需位置创建 img2 的裁剪。您可以在 此处 了解如何执行此操作
  3. 使用 img.paste() 在适当的位置将 img2 粘贴回 img 中

注释:

要查找中心坐标,可以通过宽度和高度除以 2 来得到 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接