如何在python PIL中翻译图像?

时间:2014-10-08 03:57:29

标签: python windows image-processing pillow

我的意图是如下所示:

http://postimg.org/image/pdb6urf1d/

我的功能:

def translacao(imagem1):

  imagem1.save("translate.png")
  destino = Image.open("translate.png")
  destino = destino.resize((400,400))
  #Tamanho Imagem - Largura e Altura
  width = destino.size[0]
  height = destino.size[1]
  x_loc = 20
  y_loc = 20
  x_loc = int(x_loc)
  y_loc = int(y_loc)
  imagem1.convert("RGB")
  destino.convert("RGB")

  for y in range(0, height):

     for x in range(0, width):

       xy = (x, y)     
       red, green, blue = destino.getpixel(xy)    
       x += x_loc    
       y += y_loc    
       destino.putpixel((x, y), (red, green, blue))

  return destino.save("translate.png")

出现此错误:

 C:\Python27\python.exe C:/Users/Mikhail/PycharmProjects/SistMult/histograma.py
 Traceback (most recent call last):
 File "C:/Users/Mikhail/PycharmProjects/SistMult/histograma.py", line 289, in <module>
 translacao(imagem1)
 File "C:/Users/Mikhail/PycharmProjects/SistMult/histograma.py", line 262, in translacao destino.putpixel((x, y), (red, green, blue))
 File "C:\Python27\lib\site-packages\PIL\Image.py", line 1269, in putpixel
 return self.im.putpixel(xy, value)
 IndexError: image index out of range

使用退出代码1完成处理

2 个答案:

答案 0 :(得分:0)

您正在迭代x和y但在每次迭代中更改它:

表示范围(0,高度)中的y:

 for x in range(0, width):

   xy = (x, y)     
   red, green, blue = destino.getpixel(xy)    
   x += x_loc    #this changes the value of x
   y += y_loc    #this changes the value of y

   #at this point x can be outside of 0..height-1 and y can be outside of 0..width-1
   destino.putpixel((x, y), (red, green, blue))

你可以尝试迭代:

 for y in range(0,height-yloc):
     for x in range(0,height-xloc):
        xy = (x, y)     
        red, green, blue = destino.getpixel(xy)    
        x += x_loc  
        y += y_loc  
        #at this point x can be outside of 0..height-1 and y can be outside of 0..width-1
        destino.putpixel((x, y), (red, green, blue))

BTW范围(0,a)可写为范围(a)

此外,这两个命令没有做任何事情,因为你没有将它分配给任何变量:

imagem1.convert("RGB")
destino.convert("RGB")

答案 1 :(得分:0)

我的同事设法解决了这个问题。解决方案如下:

 destino = Image.open("foto.png")
    #Tamanho Imagem - Largura e Altura
    lar = destino.size[0]
    alt = destino.size[1]
    x_loc = 200
    y_loc = 200
    imagem_original = np.asarray(destino.convert('RGB'))
    for x in range(lar):
        for y in range(alt):
            if x >= x_loc and y >= y_loc:
               yo = x - x_loc
               xo = y - y_loc
               destino.putpixel((x,y), (imagem_original[xo,yo][0],imagem_original[xo,yo][1],imagem_original[xo,yo][2]))
            else:
               destino.putpixel((x,y), (255, 255, 255, 255))
    destino.save("translate.png")