2014-10-08 1 views
-1

Мое намерение состоит в том, чтобы сделать, как показано ниже:Как перевести изображение в python PIL?

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

ответ

0

Вы выполняете итерацию по x и у, но изменить его внутри каждой итерации:

для г в диапазоне (0, высота):

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)

Кроме того, эти две команды ничего не делают, потому что вы не назначаете его ни одному из вариантов:

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

Хорошая точка, но не источник сообщения об ошибке. –

+0

Проблема в том, что x и y переводятся и после перевода выходят за пределы изображения. – carlosdc

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") 

 Смежные вопросы

  • Нет связанных вопросов^_^