2016-08-28 3 views
2

Может кто-нибудь сказать мне, как повернуть только часть изображения, как это:вращаться только часть питона изображения

this

Как найти координату/центр этого изображения:

image

i можно повернуть все изображение, используя это

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() 
+0

Попробуйте включить изображение в ваш вопрос без ссылки на него. – gowrath

+0

сделано сэр, [это изображение] (http://i.stack.imgur.com/PxGtN.png) –

+0

Сделайте копию изображения; обрезать до нужной области, которую вы хотите повернуть, повернуть и вставить в оригинал. Это работает? – gowrath

ответ

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

+0

да сэр, успешно, но я не могу сохранить новую фотографию :( –

+0

сэр, почему я не удался, если я пытаюсь использовать circle_rotate –

+0

Вы можете сохранить изображение, используя 'i2.save ('./ new_image.jpg')' – James

0

Вы можете решить эту проблему как таковую. Скажем, у вас есть img = Image.open("nime1.png")

  1. Создайте копию изображения с помощью Img2 = img.copy()
  2. Создать урожай Img2 в нужном месте с помощью img2.crop(). Вы можете прочитать, как это сделать here
  3. Paste Img2 обратно на Img в соответствующем месте с помощью img.paste()

Примечания:

Чтобы найти координату центра, можно разделить ширину и высота на 2 :)

Смежные вопросы