TypeError: putpixel() takes exactly 3 positional arguments (5 gi
Résolu
yobe
-
yobe -
yobe -
Bonjour,
J'ai un gros problème sur EduPython (2.5)
Je compose un programme pour faire un seuillage couleur sur une image. En voulant utiliser la fonction "im2.putpixel((x,y),p[0],p[1],p[2])" il me sort:"TypeError: putpixel() takes exactly 3 positional arguments (5 given) " ce que je ne comprends absolument pas.
Après plusieurs recherches et quelques bidouillages je n'ai toujours pas trouvé de solution, je me tourne donc vers vous !
Merci pour votre aide !
J'ai un gros problème sur EduPython (2.5)
Je compose un programme pour faire un seuillage couleur sur une image. En voulant utiliser la fonction "im2.putpixel((x,y),p[0],p[1],p[2])" il me sort:"TypeError: putpixel() takes exactly 3 positional arguments (5 given) " ce que je ne comprends absolument pas.
Après plusieurs recherches et quelques bidouillages je n'ai toujours pas trouvé de solution, je me tourne donc vers vous !
Merci pour votre aide !
1 réponse
-
Salut,
http://effbot.org/imagingbook/image.htm
putpixel # im.putpixel(xy, colour) #Modifies the pixel at the given position. The colour is given as a single numerical value for single-band images, and a tuple for multi-band images. #Note that this method is relatively slow. If you're using 1.1.6, pixel access objects (see load) provide a faster way to modify the image. If you want to generate an entire image, it can be more efficient to create a Python list and use putdata to copy it to the image. For more extensive changes, use paste or the ImageDraw module instead. #You can speed putpixel up a bit by "inlining" the call to the internal putpixel implementation method: im.load() putpixel = im.im.putpixel for i in range(n): ... putpixel((x, y), value) #In 1.1.6, the above is better written as: pix = im.load() for i in range(n): ... pix[x, y] = value
Et donc, tu devrais écrire :im2.putpixel((x,y), (p[0],p[1],p[2]))
au lieu deim2.putpixel((x,y), p[0],p[1],p[2])
-
Merci pour ta réponse, ça marche. Cependant lorsque je lance le programme et rentre un seuil, il me marque: "an entire required" et pourtant j'ai rentré un nombre entier. Je ne comprends pas.
- Il va nous falloir une copie entière de ton code et du message d'erreur exact, ainsi que le numéro de la ligne en question.
Je te conseil de copier ton code ici pour nous le communiquer : https://pastebin.com/
-
le voilà:
from PIL import Image
im1=Image.open("rouge1.jpg")
L,H=im1.size
im2 = Image.new ("RGB",(L,H))
S=int(input("Entrer un seuil de nuance de rouge: "))
for y in range(H):
for x in range(L):
p = im1.getpixel((x,y))
LUM=0,21*p[0]+0,71*p[1]+0,7*p[2]
if p[0]>p[1] and p[0]>p[2] and p[0]<S:
im2.putpixel((x,y), (LUM,LUM,LUM))
else:
im2.putpixel((x,y), (p[0],p[1],p[2]))
im2.save("image-seuillee.pgm")
im2.show()
Le message d'erreur est le suivant: "TypeError: an integer is required" et il n'y a aucun numéro de ligne.
Mais j'ai aussi ça dans la console: "Traceback (most recent call last):
File "C:\Users\Compaq\Desktop\seuillagecouleur2.py", line 12, in <module>
im2.putpixel((x,y), (LUM,LUM,LUM))
File "C:\Program Files (x86)\EduPython\App\lib\site-packages\PIL\Image.py", line 1274, in putpixel
return self.im.putpixel(xy, value)
TypeError: an integer is required "- Il s'agit de ta variable LUM.
LUM=0,21*p[0]+0,71*p[1]+0,7*p[2]
Comme tu peux le voir, tu fais p multiplié par un nombre à virgule dans ton calcul. Donc LUM sera converti en nombre à virgule, ce qui est différent d'un nombre entier.
Ensuite, tu donnes LUM en argument à putpixel donc la bibliothèque va crasher au moment de retourner la valeur, lorsqu'il se rend compte que le type à retourner est différent de celui attendu.
Pour corriger ça, il faut convertir LUM en nombre entier.
Par exemple :LUM=int(0,21*p[0]+0,71*p[1]+0,7*p[2])
Autre point à soulever, je ne sais pas si Python reconnaît la virgule ... mais dans le doute, utilise toujours des points au lieu des virgules.
Par exemple :LUM=int(0.21*p[0]+0.71*p[1]+0.7*p[2])
-
-