2013-04-15 3 views
0

Je dois retourner une image horizontalement, sans utiliser la fonction inverse, je pensais que je l'avais droit mais l'image retournée est juste le coin inférieur droit de l'image et il n'est pas retourné.Miroir une image en utilisant Python

Le code est je

def Flip(image1, image2): 
    img = graphics.Image(graphics.Point(0, 0), image1) 
    X = img.getWidth() 
    Y = img.getHeight() 
    for y in range(Y): 
     for x in range(X): 
      A = img.getPixel(x,y) 
      r = A[0] 
      g = A[1] 
      b = A[2] 
      color = graphics.color_rgb(r,g,b) 
      img.setPixel(X-x,y,color) 
    img = graphics.Image(graphics.Point(0,0), image2) 
    win = graphics.GraphWin(image2, img.getWidth(), img.getHeight()) 
    img.draw(win) 

Où est-ce que je me trompe?

+0

Vous avez besoin de retourner une image, mais votre fonction prend deux entrées? étrange? –

+0

la première entrée est le fichier en cours d'entrée et le second est le nom de fichier de la sortie – chh

+0

@cah Ce sont des noms de paramètres confus (et variables locales) alors. Vous réutilisez également la variable 'img' pour deux choses qui n'aident pas. – millimoose

Répondre

2

Voici certaines choses que je pourrait être amélioré:

def Flip(image1, image2): 
    img = graphics.Image(graphics.Point(0, 0), image1) 
    X = img.getWidth() 
    Y = img.getHeight() 
    for y in range(Y): 
     for x in range(X): 
      A = img.getPixel(x,y) 
      r = A[0] 
      g = A[1] 
      b = A[2] 
      color = graphics.color_rgb(r,g,b) 

Cette affectation pourrait être plus pythonique:

  r, g, b = img.getPixel(x,y) 
      color = graphics.color_rgb(r,g,b) 

      img.setPixel(X-x,y,color) 

img a maintenant l'image en demi-basculée. Cela se produit parce que vous écrivez le contenu sur la même source d'image, perdant l'ancien contenu à tout moment jusqu'à ce que vous atteigniez le milieu. (Notez que X-x augmentera la taille de l'image de 1 pixel.Si la largeur de l'image est 100, dans la première itération X-x = 100 - 0 = 100 et parce qu'il commence à 0, l'image est agrandie 1 pixel.) Ensuite, vous commencez à copier. , Vous ne l'utilisez pas non plus que le contenu parce que:

img = graphics.Image(graphics.Point(0,0), image2) 

Voici le problème: vous venez réenregistrés le contenu de img sans lui donner toute utilisation. Plus tard:

win = graphics.GraphWin(image2, img.getWidth(), img.getHeight()) 
    img.draw(win) 

Ceci semble sans rapport avec le but de la fonction (retourner une image). Ce que je voudrais faire est:

import graphics 
import sys 

def Flip(image_filename): 
    img_src = graphics.Image(graphics.Point(0, 0), image_filename) 
    img_dst = img_src.clone() 
    X, Y = img_src.getWidth(), img_src.getHeight() 
    for x in range(X): 
     for y in range(Y): 
      r, g, b = img_src.getPixel(x, y) 
      color = graphics.color_rgb(r, g, b) 
      img_dst.setPixel(X-x-1, y, color) 

    return img_dst 

if __name__ == '__main__': 
    input = sys.argv[1] or 'my_image.ppm' 
    output = 'mirror-%s' % input 
    img = Flip (input) 
    img.save(output) 

remarque que la fonction Flip prendre soin de ne feuilletant l'image, en dehors de la fonction que vous pouvez faire ce que vous avez besoin de l'image, comme vous pouvez le voir dans le programme « principal ».

Si vous souhaitez utiliser une seule image, c'est possible et plus efficace. Pour cela, vous pouvez utiliser le même principe pour échanger des valeurs entre les variables:

def Flip(image_filename): 
    img = graphics.Image(graphics.Point(0, 0), image_filename) 
    X, Y = img.getWidth(), img.getHeight() 
    for x in range(X/2): 
     for y in range(Y): 
      r_1, g_1, b_1 = img.getPixel(x, y) 
      color_1 = graphics.color_rgb(r_1, g_1, b_1) 

      r_2, g_2, b_2 = img.getPixel(X-x-1, y) 
      color_2 = graphics.color_rgb(r_2, g_2, b_2) 

      img.setPixel(X-x-1, y, color_1) 
      img.setPixel(x, y, color_2) 

    return img 
+0

J'ai essayé ceci et j'ai l'image retournée maintenant mais ce n'est toujours pas la bonne taille. C'est mon problème original où il montre seulement un quart de l'image mais maintenant le quart de l'image est retourné donc cette partie est bonne mais je ne sais pas pourquoi ce n'est pas la bonne taille – chh

+0

Ok, je vois le problème. L'image a été écrasée en perdant l'information de la moitié de l'image. J'ai ajouté et l'explication et la solution. – gpoo

+0

Je n'ai pas de système à importer, y a-t-il une autre façon de faire la fonction clone? ou une autre façon d'écrire le code pour résoudre le problème? – chh

Questions connexes