只旋转部分图像 python
only rotate part of image python
谁能告诉我如何像这样只旋转图像的一部分:
如何找到这张图片的坐标/中心:
我可以用这个旋转所有图片
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()
你可以这样解决这个问题。假设你有 img = Image.open("nime1.png")
- 使用 img2 创建图像的副本 = img.copy()
- 使用 img2.crop() 在所需位置创建 img2 裁剪。您可以阅读如何执行此操作 here
- 使用 img.paste()
将 img2 粘贴回 img 的适当位置
备注:
要找到中心坐标,可以将宽度和高度除以2 :)
您可以裁剪图片的某个区域作为新变量。在这种情况下,我从原始图像中裁剪出一个 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))
所以我仔细考虑了这一点,并设计了一个函数,在旋转之前将圆形蒙版应用于裁剪后的图像。这允许任意角度而不会出现奇怪的效果。
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
谁能告诉我如何像这样只旋转图像的一部分:
如何找到这张图片的坐标/中心:
我可以用这个旋转所有图片
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()
你可以这样解决这个问题。假设你有 img = Image.open("nime1.png")
- 使用 img2 创建图像的副本 = img.copy()
- 使用 img2.crop() 在所需位置创建 img2 裁剪。您可以阅读如何执行此操作 here
- 使用 img.paste() 将 img2 粘贴回 img 的适当位置
备注:
要找到中心坐标,可以将宽度和高度除以2 :)
您可以裁剪图片的某个区域作为新变量。在这种情况下,我从原始图像中裁剪出一个 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))
所以我仔细考虑了这一点,并设计了一个函数,在旋转之前将圆形蒙版应用于裁剪后的图像。这允许任意角度而不会出现奇怪的效果。
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