Python JES收缩算法不起作用

Python JES收缩算法不起作用,python,algorithm,jython,jes,Python,Algorithm,Jython,Jes,我正试图写一个简单的算法来将图片的大小减半,这对我来说似乎是有意义的,但我可能遗漏了一些明显的东西,我想知道是否有人能给我指出正确的方向 a = pickAFile() b = makePicture(a) c = getWidth(b) d = getHeight(b) e = (c * 3) / 4 f = (d * 3) / 4 canvas = makeEmptyPicture(e,f) sourceX = 1 for targetX in range (1, c): sourceY

我正试图写一个简单的算法来将图片的大小减半,这对我来说似乎是有意义的,但我可能遗漏了一些明显的东西,我想知道是否有人能给我指出正确的方向

a = pickAFile()
b = makePicture(a)
c = getWidth(b)
d = getHeight(b)
e = (c * 3) / 4
f = (d * 3) / 4
canvas = makeEmptyPicture(e,f)
sourceX = 1
for targetX in range (1, c):
  sourceY = 1
  for targetY in range (1, d):
    color = getColor(getPixel(b, sourceX, sourceY))
    setColor(getPixel(canvas, targetX, targetY), color)
    sourceY = sourceY + 2
    sourceX = sourceX + 2
show(canvas)
show(b)

编辑:当我尝试按现在的方式运行它时,我得到了for循环的索引越界错误。

首先,画布的尺寸应该是原始图像的一半。所以你应该改变

e = (c * 3) / 4
f = (d * 3) / 4

其次,for循环意味着从新图像的第一个像素迭代到最后一个像素。请更改以下内容

for targetX in range (1, c):

下一个问题是在内部for循环中增加变量sourceX。您需要更改此行代码的缩进,使其成为外部for循环的一部分

完整的代码应该如下所示

a = pickAFile()
b = makePicture(a)
c = getWidth(b)
d = getHeight(b)
e = c / 2
f = d / 2
canvas = makeEmptyPicture(e,f)
sourceX = 1
for targetX in range (1, e):
  sourceY = 1
  for targetY in range (1, f):
    color = getColor(getPixel(b, sourceX, sourceY))
    setColor(getPixel(canvas, targetX, targetY), color)
    sourceY = sourceY + 2
  sourceX = sourceX + 2
show(canvas)
show(b)

我最后建议您为变量选择更有意义的名称。分别命名c和e、sourceWidth和targetWidth可以帮助您更容易地识别for循环的问题。输入几个额外的键所花费的时间也比在代码中查找问题所花费的时间要少。

我不知道什么是JES,我也不太了解图片,但据我所知,您希望通过复制带有奇数坐标的每个源像素来创建新图片(目标图片)(x和y坐标从1,3,5,…)我认为e和f是目标图片的高度和宽度。如果目标图片有一半宽度和一半高度,为什么e=(c*3)/4不是e=c/2和f=d/2?为什么目标x从1运行到c,目标y从1运行到d?我怀疑目标x应该从1运行到e(大约是c/2).但可能我对涉及的主题了解较少。我肯定有一些东西超出了范围,但确切的错误信息是什么?
for targetX in range (1, e):
for targetY in range (1, d):
for targetY in range (1, f):
a = pickAFile()
b = makePicture(a)
c = getWidth(b)
d = getHeight(b)
e = c / 2
f = d / 2
canvas = makeEmptyPicture(e,f)
sourceX = 1
for targetX in range (1, e):
  sourceY = 1
  for targetY in range (1, f):
    color = getColor(getPixel(b, sourceX, sourceY))
    setColor(getPixel(canvas, targetX, targetY), color)
    sourceY = sourceY + 2
  sourceX = sourceX + 2
show(canvas)
show(b)