PIL简单渐变和TypeError:需要一个整数

时间:2015-06-11 11:09:21

标签: python python-imaging-library

我看过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

我不知道&#34;需要整数&#34;, - 假设putpixel的所有参数都报告为<type 'int'>

如何让它发挥作用?

2 个答案:

答案 0 :(得分:3)

您正在使用模式创建图像&#39; L&#39; (单个8位像素值),因此您输入的值需要为int&lt;你正在放置一个需要&#39; RGB&#39;模式。我认为将代码更改为img.putpixl((x,y), val)可以解决问题。

答案 1 :(得分:1)

啊,得到它:图像类型'L'是灰度/单色,所以每个像素需要一个整数值,而不是RGB元组:

img.putpixel((x, y), val)

如果图像是'RGB'类型(即Image.new('RGB',...),则写入的命令有效:

img.putpixel((x, y), (val, val, val))