2014-11-28 4 views
0

여기 새내기. =) 나는 이미지를 반전 시도했지만 오류가 있고 난 몰라 왜 :/파이썬 오류 : IndexError : 이미지 색인이 범위를 벗어났습니다 (im.putpixel)

오류 :

Traceback (most recent call last): 
    File "C:/Users/Florian/Documents/ISN/S10/défi11.py", line 10, in <module> 
    im.putpixel((x,600-y),(p[0],p[1],p[2])) 
    File "C:\Python27\lib\site-packages\PIL\Image.py", line 1267, in putpixel 
return self.im.putpixel(xy, value) 
IndexError: image index out of range 

강령 :

# -*- coding: cp1252 -*- 
from PIL import Image 
im=Image.open("H:\Belem.png") 
L,H=im.size 
for y in range(H): 
    for x in range(L): 
     p=im.getpixel((x,y)) 
     im.putpixel((x,600-y),(p[0],p[1],p[2])) 
im.save("H:\defi11.png") 
+0

600은 어디에서 왔습니까? 왜 'H-1-y'를 쓰지 않는거야? – amaurea

답변

0

I 이미지를 수직으로 뒤집으려면 다음을 수행해야합니다.

for y in range(H/2): 
    for x in range(L): 
     p1=im.getpixel((x,y)) 
     p2=im.getpixel((x,H-1-y)) 
     im.putpixel((x,H-1-y),p1) 
     im.putpixel((x,y),p2) 

이렇게하면 나중에 필요하게 될 픽셀을 덮어 쓰지 않습니다. 선의 전반부를 반복하며 선의 나머지 절반과 교환합니다. 또 다른 방법은 같은 모양의 다른 출력 이미지를 작성하여 작성하는 것입니다.

im2 = im.copy() 
for y in range(H): 
    for x in range(L): 
     p=im.getpixel((x,y)) 
     im2.putpixel((x,H-1-y),p1) 
im2.save("flipped.png") 

위의 버전과 동일한 효과가 있지만 더 많은 메모리를 사용합니다.

나는 당신의 예에서 600H의 하드 코딩 된 버전입니다 생각,하지만 당신은 지수에서 H-10에서하지 갈 것을 고려하기 위해 그에서 추가 한 (내가 위에서처럼) 빼기해야 1 ~ H. 프로그램 y의 첫 번째 루프는 0이므로 600-y600입니다. 600이 이미지의 높이 인 경우 마지막 인덱스 ( 600-1) 이상으로 이동하므로 IndexError 예외가 트리거됩니다. 당신이 numpy 설치 한 경우

, 다음 빠르고 간단한 방법은 같은 일이 달성하기 :

import numpy as np, PIL 
original=PIL.Image.open("original.png") 
arr = np.array(im) 
flipped = PIL.Image.fromarray(arr[::-1]) 
flipped.save("flipped.png") 

numpy 형식도 쉽게 픽셀에 수학을하는 같은 다른 작업을 수행 할 수 있습니다.

+0

오 예 네가 높이에서'1'을 뺀 것을 잊어 버렸고 나는 왜'600'을 사용했는지'H''가 분명히 더 좋았습니다 ... 정말 고마워요 : D –

+0

이제 나는 구식의 거울을 가지고 있습니다. 솔루션에 대해 생각할 필요가 있습니다 : D –

+0

나는'nampy'를 사용하지 않습니다.이 작업을 위해 기본 명령을 사용해야합니다. –

관련 문제