2017-05-30 125 views
-3

我写了一小段代码到尝试来创建一个图像,每个Y值只有一个黑点,但是它会为每个Y值创建一个以上的黑点。图像 - >the output imagefor循环做奇怪的事情python

图像很小,但您可以看到每个Y值可以有多个黑点。实际的代码:

from PIL import Image 
from random import * 
from math import * 

white = (255,255,255) 
black = (0,0,0) 

width = 50 
height = 10 
num = 0 
def line(num): 
    mylist = [] 
    a = Image.new("RGB", (width, height)) 
    for row in xrange(width): 
     dot = False 
     for col in xrange(height): 
      rand = random() 
      b = float(col)/(width-1) 
      if b > rand and not dot: 
       mylist.append(black) 
       dot = True 
      else: 
       mylist.append(white) 
    a.putdata(mylist) 
    a.save("boop"+str(num)+".png") 

line(num) 

通常,当它附加一个黑点,dot变得真实,所以不能有像素的下一行之前的另一个黑点。为什么这不起作用?

编辑:所需输出的为例 - >desired output

+0

欢迎StackOverflow的。请阅读并遵守帮助文档中的发布准则。 [最小,完整,可验证的示例](http://stackoverflow.com/help/mcve)适用于此处。在发布您的MCVE代码并准确描述问题之前,我们无法为您提供有效的帮助。 我们应该能够将发布的代码粘贴到文本文件中,并重现您描述的问题。 – Prune

+0

调试线路的输出在哪里?如果没有其他的东西,你应该插入一些战略性地放置的'print'语句,并在生成它们时转储这些点。看到这个可爱的[debug](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)博客寻求帮助。 – Prune

+0

目前还不清楚你在问什么。当你找到一个黑点时,也许在你的for循环中使用'continue'?随机数的目的是什么?看起来你的代码被设置为接受违反我所了解的是你的标准,并有一些随机的可能性。 – roganjosh

回答

2

你的行被设置为范围宽度和您的列是高度,改变xrange(width)xrange(height)反之亦然然后根据需要将图像应该被输出。

现在,它正在检查一个点的10个列,而不是它应该查找的50个列。

编辑3

import numpy as np 

#other declarations as above# 

def line(num): 
    mylist = np.zeros((width, height)) 
    for row in mylist: 
     row[randint(0,9)] = 1 
    npArr = mylist.T 
    a = Image.new("RGB", (width, height)) 
    mylist = [] 
    for idx, val in np.ndenumerate(npArr): 
     if val == 1: 
      mylist.append(black) 
     else: 
      mylist.append(white) 
    a.putdata(mylist) 
    a.save("boop"+str(num)+".png") 

如果你可以安装numpy的,你可以创建一个数组,填充它按行,因为你可以添加一个随机1(点)的一列,然后旋转该阵列为横向。

输出 - >enter image description here

+0

我试着玩循环的第一和所有,但我写它的顺序in给出最接近的期望输出,其他任何事情都会让事情变得更糟 – Tissuebox

+0

我并不是说要改变循环的顺序,只是为了替换'xrange'调用中的值,其他的都应该保持不变。 – njoosse

+0

谢谢你的回答,我实际上认为问题是附加问题,因为从左上角读取列表到右下角首先读取,当我写入时,我添加了Y值(从上到下),然后在X轴上右转 – Tissuebox

0

让我发现了什么问题,该putdata(名单)函数写从左到右然后从上到下的图像,但我的函数试图从上方追加到然后从左到右,所以它不会创建正确的输出。为了解决这个问题,我使用白色填充列表(宽度*高度时间),然后使用[col * width + row]公式更改列表中的颜色。的代码:

width = 50 
height = 10 
num = 0 
mylist = [] 
def line(num): 
    a = Image.new("RGB", (width, height)) 
    for pixel in xrange(width*height): 
     mylist.append(white) 
    for row in xrange(width): 
     dot = False 
     for col in xrange(height): 
      rand1 = random() 
      rand2 = random() 
      b = float(col)/(height-1) 
      if rand1 < b < rand2 and not dot: 
       mylist[col*width+row] = black 
       dot = True 
      if col == height-1 and not dot: 
       rand3 = randint(0, height-1) 
       mylist[rand3*width+row] = black 
    a.putdata(mylist) 
    a.save("boop"+str(num)+".png") 

line(num) 

输出 - >output