你可以将图片的某一区域裁剪为一个新的变量。在这种情况下,我从原始图像中裁剪出一个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](https://istack.dev59.com/6qc9r.webp)
所以我认真思考了一下,并编写了一个函数,在旋转之前对裁剪的图像应用一个圆形掩膜,这样可以避免出现奇怪的影响,从而实现任意角度旋转。
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)
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
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](https://istack.dev59.com/CkIVH.webp)