【问题标题】:Putpixel function not generating all the pixelsPutpixel 函数未生成所有像素
【发布时间】:2020-07-25 01:35:16
【问题描述】:

我的目标是为每个像素生成一种颜色以填满整个画布但是生成的图像总是变成黑色,只有一个像素改变了颜色,我似乎无法弄清楚我做错了什么.

import random
from PIL import Image

canvas = Image.new("RGB", (300,300))

y = random.randint(1, canvas.width)
x = random.randint(1, canvas.width)

r = random.randint(0,255)
g = random.randint(0,255)
b = random.randint(0,255)

rgb = (r,g,b)

for i in range(canvas.width): 
    canvas.putpixel((x,y), (rgb))

canvas.save("test.png", "PNG")

print("Image saved successfully.")

【问题讨论】:

    标签: python image python-imaging-library


    【解决方案1】:

    您确实应该尽量避免在任何 Python 图像处理中使用 for 循环 - 它们速度慢且容易出错。

    制作随机图像的最简单、最快的方法是使用矢量化 Numpy 函数,如下所示:

    import numpy as np
    from PIL import Image
    
    # Create Numpy array 300x300x3 of random uint8
    data = np.random.randint(0, 256, (300,300,3), dtype=np.uint8)
    
    # Make into PIL Image
    im = Image.fromarray(data)
    

    【讨论】:

      【解决方案2】:

      您的代码的问题在于您没有遍历每个像素。我已经修改了您的代码以迭代每个像素,检查它是否为黑色 (0,0,0),然后在该迭代上放置一个像素,并使用您随机生成的 rgb 值。然后,我重新生成 3 个新的随机数并将它们放回 rgb 元组中,导致循环中的下一个像素具有不同的 rgb 值。

      xy 定义是多余的,因为您希望每个像素都有一个随机颜色但不希望随机像素,所以我删除了它们。我添加了一个声明,pixels = canvas.load(),它为像素分配内存,以便您可以迭代它们并更改每个单独的颜色。如果您想了解更多信息,我非常依赖this 类似的stackoverflow 问题。这是我的代码:

      canvas = Image.new("RGB", (300,300))
      pixels = canvas.load()
      
      width, height = canvas.size
      
      for i in range(width): 
          for j in range(height):
              if pixels[i,j] == (0,0,0):
                  r = random.randint(0,255)
                  g = random.randint(0,255)
                  b = random.randint(0,255)
                  rgb = (r,g,b)
                  canvas.putpixel((i,j), (rgb))
                  
      canvas.save("test.png", "PNG")
      
      print("Image saved successfully.")
      

      这是产生的输出:

      【讨论】:

      • 你说得对,我已经删除了那些作业。抱歉,这是我第一次与 PIL 合作。
      猜你喜欢
      • 2022-10-06
      • 2020-06-28
      • 1970-01-01
      • 2012-12-20
      • 1970-01-01
      • 1970-01-01
      • 2014-10-31
      • 2021-10-06
      • 2018-06-06
      相关资源
      最近更新 更多