PIL simple gradient and TypeError: an integer is required
PIL simple gradient and TypeError: an integer is required
我看过 numpy-->PIL int type issue,但它没有回答我的问题,这个问题更简单,因为它没有使用 numpy
。考虑这个例子:
import Image
import math
img = Image.new('L', (100, 50), 'white')
a = 0.1 # factor
for x in xrange(img.size[0]):
for y in xrange(img.size[1]):
# val: 0 to 255; 255/2 = 127.5;
val = int( 127.5*math.sin(a*y) + 127.5 )
print x, y, val, type(x), type(y), type(val)
img.putpixel((x, y), (val, val, val))
img.save('singrad.png', 'png')
这失败了:
$ python test.py
0 0 127 <type 'int'> <type 'int'> <type 'int'>
Traceback (most recent call last):
File "test.py", line 11, in <module>
img.putpixel((x, y), (val, val, val))
File "/usr/lib/python2.7/dist-packages/PIL/Image.py", line 1267, in putpixel
return self.im.putpixel(xy, value)
TypeError: an integer is required
我没看到什么 "integer is required",- 考虑到 putpixel
的所有参数都报告为 <type 'int'>
?
如何让它工作?
您正在创建模式为 'L' 的图像(单个 8 位像素值),因此您输入的值需要是 int < 255。您正在输入一个需要 'RGB' 模式。我认为将您的代码更改为 img.putpixl((x,y), val)
可以解决问题。
啊,知道了:图像类型 'L'
是 grayscale/monochrome,所以每个像素需要一个整数值,而不是 RGB 元组:
img.putpixel((x, y), val)
如果图像类型为 'RGB'
(即 Image.new('RGB',...
),则书面命令有效:
img.putpixel((x, y), (val, val, val))
我看过 numpy-->PIL int type issue,但它没有回答我的问题,这个问题更简单,因为它没有使用 numpy
。考虑这个例子:
import Image
import math
img = Image.new('L', (100, 50), 'white')
a = 0.1 # factor
for x in xrange(img.size[0]):
for y in xrange(img.size[1]):
# val: 0 to 255; 255/2 = 127.5;
val = int( 127.5*math.sin(a*y) + 127.5 )
print x, y, val, type(x), type(y), type(val)
img.putpixel((x, y), (val, val, val))
img.save('singrad.png', 'png')
这失败了:
$ python test.py
0 0 127 <type 'int'> <type 'int'> <type 'int'>
Traceback (most recent call last):
File "test.py", line 11, in <module>
img.putpixel((x, y), (val, val, val))
File "/usr/lib/python2.7/dist-packages/PIL/Image.py", line 1267, in putpixel
return self.im.putpixel(xy, value)
TypeError: an integer is required
我没看到什么 "integer is required",- 考虑到 putpixel
的所有参数都报告为 <type 'int'>
?
如何让它工作?
您正在创建模式为 'L' 的图像(单个 8 位像素值),因此您输入的值需要是 int < 255。您正在输入一个需要 'RGB' 模式。我认为将您的代码更改为 img.putpixl((x,y), val)
可以解决问题。
啊,知道了:图像类型 'L'
是 grayscale/monochrome,所以每个像素需要一个整数值,而不是 RGB 元组:
img.putpixel((x, y), val)
如果图像类型为 'RGB'
(即 Image.new('RGB',...
),则书面命令有效:
img.putpixel((x, y), (val, val, val))