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
Vous avez besoin de retourner une image, mais votre fonction prend deux entrées? étrange? –
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
@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