【问题标题】:Python nested while-loop doesn't increment as expectedPython嵌套的while循环不会按预期增加
【发布时间】:2013-04-20 04:49:39
【问题描述】:

我正在用 Python 编写一个函数来像素化图像,但由于某种原因 xx 和 x 不会增加。两个变量始终保持值为 0,没有任何反应。

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# 实现中获得了算法的灵感: http://notes.ericwillis.com/2009/11/pixelate-an-image-with-csharp/

【问题讨论】:

  • 我不确定,但请检查是否有缩进问题
  • 也许block_size == 0 ?
  • GrijeshChauhan:我试图查看缩进是否有问题,但找不到任何东西。 Elazar:不应该是问题,因为 yy 和 y 正确递增。感谢下面的回答!
  • 更好:block_size_half = block_size // 2。很简单,可以省略。

标签: python python-3.x while-loop increment pixelate


【解决方案1】:

我看不出你为什么不使用xrange()(或range()

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

[编辑]

重写整个例子,你会得到类似的东西:

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)

这可能会变得更短。

【讨论】:

  • 谢谢! :) 似乎 xrange() 不是 Python 3.x 的一部分请注意,代码中的 offsetX/Y 是当前像素块内的偏移量(即在两个外部循环内)。我将发布整个方法,以便有意义。
猜你喜欢
  • 2020-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-01
相关资源
最近更新 更多