Перевернуть изображение по горизонтали в Python (JES)

Мне нужно сделать функцию, которая будет копировать изображение, но зеркально. Я создал код для зеркального отображения изображения, но он не работает, и я не знаю почему, потому что я отследил код, и он должен отражать изображение. Вот код:

def invert(picture):
 width = getWidth(picture)
 height = getHeight(picture)

 for y in range(0, height):
   for x in range(0, width):
    sourcePixel = getPixel(picture, x, y)
    targetPixel = getPixel(picture, width - x - 1, height - y - 1)
    color = getColor(sourcePixel)
    setColor(sourcePixel, getColor(targetPixel))
    setColor(targetPixel, color)
 show(picture)
 return picture 

def main():
  file = pickAFile()
  picture = makePicture(file)
  newPicture = invert(picture)
  show(newPicture)

Может кто-нибудь объяснить мне, что не так? Спасибо.


person user2387191    schedule 16.06.2013    source источник
comment
show(picture) и return picture должны иметь отступ   -  person bozdoz    schedule 16.06.2013
comment
Пожалуйста, обновите блок кода до mirror ;-) того, что есть в вашем локальном файле...   -  person Gauthier Boaglio    schedule 16.06.2013
comment
@boazdoz, когда я это делаю, у меня возникает ошибка при попытке передать аргумент функции.   -  person user2387191    schedule 16.06.2013
comment
@Golgauth, я не знаю, что вы имеете в виду ... этот курс, который я беру, - это jython для начинающих, поэтому я не знаком с какими-либо API-интерфейсами python, если вы это имеете в виду.   -  person user2387191    schedule 16.06.2013
comment
Нет, но исправьте свой отступ в теле вопроса, чтобы нас не запутали с плохим отступом (нажмите на ссылку edit внизу)   -  person Gauthier Boaglio    schedule 16.06.2013
comment
@Golgauth мой плохой, исправлено! Но да. Еще одна странность заключается в том, что когда я делю высоту на 2 в диапазоне for y, изображение переворачивается по горизонтали и вертикали, но когда я делю ширину на 2, происходит то же самое. Я думаю, что в targetPixel, если я сделаю просто высоту вместо высоты - y - 1, это сработает, но когда я это сделаю, моя идея говорит, что есть ошибка.   -  person user2387191    schedule 16.06.2013
comment
@Golgauth ошибка передачи аргумента функции   -  person user2387191    schedule 16.06.2013


Ответы (2)


Попробуй это :

def flip_vert(picture):
    width = getWidth(picture)
    height = getHeight(picture)

    for y in range(0, height/2):
        for x in range(0, width):
            sourcePixel = getPixel(picture, x, y)
            targetPixel = getPixel(picture, x, height - y - 1)
            color = getColor(sourcePixel)
            setColor(sourcePixel, getColor(targetPixel))
            setColor(targetPixel, color)

    return picture 


def flip_horiz(picture):
    width = getWidth(picture)
    height = getHeight(picture)

    for y in range(0, height):
        for x in range(0, width/2):
            sourcePixel = getPixel(picture, x, y)
            targetPixel = getPixel(picture, width - x - 1, y)
            color = getColor(sourcePixel)
            setColor(sourcePixel, getColor(targetPixel))
            setColor(targetPixel, color)

    return picture 
person Gauthier Boaglio    schedule 16.06.2013
comment
это так странно, потому что я придумал этот код всего 10 минут назад, ха-ха. Но он все равно переворачивает картинку по вертикали, а не по горизонтали. Я пробовал возиться с ним, но он не производил горизонтального флипа. - person user2387191; 16.06.2013
comment
Хорошо, я понял ответ, для x в диапазоне должна быть ширина / 2, а для целевого пикселя ширина - x - 1, y, спасибо за вашу помощь, ребята! - person user2387191; 16.06.2013

Проблема в том, что вы зацикливаетесь на всем изображении, а не только на половине ширины. Вы дважды зеркально отражаете свое изображение и получаете на выходе то же изображение, что и то, которое вы вводите.

если вы зеркально отразите оси Y, код должен быть

for y in range(0, height):
for x in range(0, int(width / 2)):
person Alexandru Barbarosie    schedule 16.06.2013
comment
поэтому мне нужно было бы изменить x в диапазоне (0, ширина): на x в диапазоне (0, ширина / 2): ? если это так, когда я пытаюсь это сделать, он переворачивает изображение по горизонтали и вертикали. Я только хочу перевернуть его по горизонтали - person user2387191; 16.06.2013
comment
Если вы хотите перевернуться по горизонтали, она должна проходить через половину высоты. - person Alexandru Barbarosie; 16.06.2013
comment
Да, но даже если я это сделаю, это даст мне такой же результат, как если бы я разделил ширину на 2. - person user2387191; 16.06.2013
comment
Итак, если я не разделю ни один из диапазонов на два, он просто выдаст то же самое изображение, которое я ввел. Если я разделю высоту на два в диапазоне y, изображение перевернется как по горизонтали, так и по вертикали. Если я разделю ширину на 2, получится то же самое. Я хочу, чтобы картинка переворачивалась только по горизонтали. - person user2387191; 16.06.2013
comment
@user2387191 user2387191 Обновил мой ответ. Что это дает? - person Gauthier Boaglio; 16.06.2013