Python PIL编辑像素与ImageDraw.point

时间:2014-01-18 15:07:08

标签: python image

我正在制作一个图像生成程序,我在尝试直接编辑图像像素时遇到了问题。

我原来的方法很简单:

image = Image.new('RGBA', (width, height), background)
drawing_image = ImageDraw.Draw(image)

# in some loop that determines what to draw and at what color
    drawing_image.point((x, y), color)

这很好用,但我认为直接编辑像素可能会稍快一些。我计划使用"非常"高分辨率(可能是10000像素×10000像素),因此即使每个像素的时间略有减少也会大幅减少。

我试过用这个:

image = Image.new('RGBA', (width, height), background)
pixels = image.load()

# in some loop that determines what to draw and at what color
    pixels[x][y] = color # note: color is a hex-formatted string, i.e "#00FF00"

这给了我一个错误:

Traceback (most recent call last):
  File "my_path\my_file.py", line 100, in <module>
    main()
  File "my_path\my_file.py", line 83, in main
    pixels[x][y] = color
TypeError: argument must be sequence of length 2

实际的pixels[x][y]如何运作?我似乎在这里错过了一个基本概念(我从未在此之前直接编辑像素),或者至少只是不了解所需的参数。我甚至试过了pixels[x][y] = (0, 0, 0),但这引起了同样的错误。

此外,是否有更快的方式来编辑像素?我听说使用pixels[x][y] = some_color比绘制到图像更快,但我可以使用其他任何更快的方法。

提前致谢!

1 个答案:

答案 0 :(得分:6)

您需要将元组索引传递为pixels[(x, y)]或简单地pixels[x, y],例如:

#-*- coding: utf-8 -*-
#!python
from PIL import Image

width = 4
height = 4
background = (0, 0, 0, 255)

image = Image.new("RGBA", (width, height), background)
pixels = image.load()

pixels[0, 0] = (255, 0, 0, 255)
pixels[0, 3] = (0, 255, 0, 255)
pixels[3, 3] = (0, 0, 255, 255)
pixels[3, 0] = (255, 255, 255, 255)

image.save("image.png")