2013-04-26 2 views
0

이미지를 픽셀 화하기 위해 Python에서 함수를 작성하고 있지만 어떤 이유로 xx와 x가 증가하지 않습니다. 두 변수 모두 값 0을 유지하며 아무 일도 일어나지 않습니다.Python 중첩 된 while 루프가 예상대로 증가하지 않습니다.

xx = 0 
yy = 0 

while xx < width: 
    while yy < height: 
     print ("---", xx, yy) 
     offsetX = xx + block_size_half 
     offsetY = yy + block_size_half 

     while (xx + offsetX >= width): 
      offsetX -= 1 
     while (yy + offsetY >= height): 
      offsetY -= 1 

     r, g, b = matrix[xx + offsetX][yy + offsetY] 

     x = xx 
     y = yy 
     while x < xx + block_size and x < width: 
      while y < yy + block_size and y < height: 
       print (x, y) 
       matrix[x][y] = (r, g, b) 
       y += 1 

      x += 1 

     yy += block_size 

    xx += block_size 

도움을 주신 @Elazar에게 감사드립니다.

def pixelate(matrix, block_size): 
    width = len(matrix) 
    height = len(matrix[0]) 
    block_size_half = int(block_size/2) 

    for xx in range(0, width, block_size): 
     for yy in range(0, height, block_size): 

      offsetX = min(xx + block_size_half, width - 1) 
      offsetY = min(yy + block_size_half, height - 1) 

      r, g, b = matrix[offsetX][offsetY] 

      for x in range(xx, min(xx + block_size, width)): 
       for y in range(yy, min(yy + block_size, height)): 
        matrix[x][y] = (r, g, b) 

나는이 C#을 구현의 알고리즘에 대한 영감을 얻었다 : 당신이 xrange() (또는 range())를 사용하지 않을 이유가 이유를 볼 수 없습니다 http://notes.ericwillis.com/2009/11/pixelate-an-image-with-csharp/

+0

들여 쓰기 문제가 있는지 잘 모르겠습니다. –

+0

아마도 'block_size == 0'입니까? – Elazar

+0

GrijeshChauhan : 들여 쓰기에 문제가 있는지 확인하려고했지만 아무것도 찾을 수 없었습니다. Elazar : yy 및 y가 올바르게 증가하므로 문제가되지 않아야합니다. 아래 답변 주셔서 감사합니다! – user2252177

답변

0

여기에 전체 작업 기능입니다
for xx in range(0, width, block_size): 
    for yy in range(0, height, block_size): 
     ... 

[편집]

전체 예제를 다시 작성하면 like :

for xx in range(0, width, block_size): 
    for yy in range(0, height, block_size): 
     print ("---", xx, yy) 
     offsetX = min(width, xx + block_size_half) 
     offsetY = min(height, yy + block_size_half) 

     r, g, b = matrix[xx + offsetX][yy + offsetY] 

     for x in range(xx, min(xx + block_size, width)): 
      for y in range(yy, min(yy + block_size, height)): 
       print (x, y) 
       matrix[x][y] = (r, g, b) 

이는 아마도 더 짧아 질 수 있습니다.

+0

고마워요! :) xrange()는 Python 3.x의 일부가 아닙니다. 코드의 offsetX/Y는 현재 픽셀 블록 (즉, 두 개의 외부 루프) 내의 오프셋입니다. 전체 방법을 게시하여 이해하는 방법을 알려 드리겠습니다. – user2252177

관련 문제