2012-06-03 4 views
1

У меня возникла проблема с сохранением изображения после его вращения. Я имею в виду, когда я вызываю функцию save после поворота изображения, ничего не происходит. Старое изображение остается прежним, и эта проблема возникает с моей функцией сохранения. Я думаю, проблема кроется в моей функции вращения:Python PIL сохранить изображение после поворота

def right90 (root, image, panel, filemenu): 
     image = image.transpose(Image.ROTATE_90) 
     image1 = ImageTk.PhotoImage(image) 
     root.geometry("%dx%d+%d+%d" % (image.size[0], image.size[1], 0, 0)) 
     panel.configure(image = image1) 
     panel.pack(side='top', fill='both', expand='yes') 
     panel.image = image1 

Ниже приведена функция сохранения, которую я использую. Думаю, у меня нет никаких проблем.

def save(image, filename): 
    image.save(filename) 

Однако я не могу понять, где лежит проблема. Я действительно надеюсь, что кто-то поможет мне найти его. Благодарю.

Edited

Ниже функция, где я объявляю переменные глобальными. Это используется для открытия файла изображения и использования информации файла для присвоения значения переменным.

def display(root): 
    global filename 
    filename = askopenfilename(filetypes=[("All Files","*"),("All Picture Files","*bmp; *.png; *.jpg; *.jpeg; *.jpe; *.tif; *.tiff")]) 

    global image 
    global panel 
    try: 
     image = Image.open(filename) 
     image1 = ImageTk.PhotoImage(file=filename) 
     root.geometry("%dx%d+%d+%d" % (image.size[0], image.size[1], 0, 0)) 
     panel.configure(image = image1) 
     panel.pack(side='top', fill='both', expand='yes') 
     panel.image = image1 

    except NameError:   
     image = Image.open(filename) 
     image1 = ImageTk.PhotoImage(file=filename) 
     root.geometry("%dx%d+%d+%d" % (image.size[0], image.size[1], 0, 0)) 
     panel= Label(root, image = image1) 
     panel.pack(side='top', fill='both', expand='yes') 
     panel.image = image1 

И следующий код, который я написал для вызова функции rotate. В случае, если это кому-то нужно.

rotatemenu.choices.add_command(label="rotate right 90°", command = lambda:img.right90(root, image, panel, filemenu)) 
+0

Не может быть, что 'image1 = ImageTk.PhotoImage (изображение)' берет 'образ' из вызова функции, а не тот, который описан в строке чуть выше? Попробуйте изменить его имя? – Junuxx

ответ

1

Я подозреваю, что, когда вы звоните save, вы передаете переменную, которая ссылается на исходное изображение. Просто гадать, потому что right90 не return image.

+0

На самом деле я не уверен в вашем предположении, потому что мой «образ» является глобальной переменной. Затем, когда его значение изменено (назначается на image.transpose), тогда его изменение будет глобально правильным? –

+0

Если вы хотите изменить глобальную переменную внутри функции, вы также должны объявить ее «глобальной» внутри этой функции. (Но обычно лучше вообще избегать такого подхода) –

+0

'image' - глобальная переменная в основном методе, где я называю имя функции как команду меню, но она используется как параметр в этой команде. И Python не позволяет объявлять параметр глобальной переменной. Думаю, это немного сложно. –

0

Должно ли иметь как переменные имена, image, так и image1? Я думаю, что это может быть потенциальным источником проблем, и я согласен с @janne Karila, вы, скорее всего, не возвращаете измененное изображение.

Вы можете сделать image.show()/image1.show() внутри вашей функции right90 и посмотреть, что он показывает?

+0

, когда я нажимаю rotate (я использую GUI здесь), изображение поворачивается, но когда я нажимаю save, ничего не происходит. И я использую image1, чтобы добавить его на ярлык (для чего требуется PhotoImage) –

+0

вы могли бы разместить код, который вызывает обе функции? Я не уверен, что использование глобальных переменных - это выгодно, так что это немного беспокоит проблемы. – Levon

+0

Я добавил в свой вопрос более подробную информацию. Я тоже очень смущен, потому что у меня есть некоторые другие функции, используемые для изменения значений RGB изображений, и я отображаю изображение так же, как и для вращения, но функция сохранения работает нормально, поэтому я по-прежнему считаю, что проблема лежит в функции вращения. –

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