我需要水平翻转图片,不使用反向功能,我认为我没错,但返回的图片只是图片的右下角而且没有翻转。< / p>
我的代码是
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)
我哪里出错了?
答案 0 :(得分:2)
我觉得有些事情可以改进:
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)
此作业可能更多 pythonic :
r, g, b = img.getPixel(x,y)
color = graphics.color_rgb(r,g,b)
img.setPixel(X-x,y,color)
img
现在图像半翻转。发生这种情况的原因是您在同一图像源上编写内容,随时丢失旧内容,直到您到达中间位置。 (请注意,X-x
会将图像大小增加1个像素。如果图像宽度为100,则在第一次迭代X-x = 100 - 0 = 100
中,因为它从0开始,图像会变宽1像素。)然后,你开始复制了。此外,您不使用该内容,因为:
img = graphics.Image(graphics.Point(0,0), image2)
问题在于:您只是覆盖了img
的内容而没有给它任何用处。后:
win = graphics.GraphWin(image2, img.getWidth(), img.getHeight())
img.draw(win)
这似乎与功能的目的无关(翻转图像)。我会做的是:
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)
注意到函数Flip
只关注图像,在函数之外,你可以做任何你需要的图像,正如你在'main'程序中看到的那样。
如果您只想使用一张图片,则可以提高效率。为此,您可以使用相同的原则在变量之间交换值:
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