TypeError: putpixel() takes exactly 3 positional arguments (5 gi
Résolu/Fermé
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 !
A voir également:
- Missing one positional argument python
- Typeerror: unsupported operand type(s) for -: 'str' and 'str' ✓ - Forum Python
- Typeerror: 'float' object is not subscriptable - Forum Python
- Fatal error: uncaught typeerror: unsupported operand types: string + int ✓ - Forum PHP
- Uncaught typeerror: cannot read properties of null (reading 'addeventlistener') ✓ - Forum Javascript
- Typeerror: botbase.__init__() missing 1 required keyword-only argument: 'intents' ✓ - Forum Python
1 réponse
SypayV
Messages postés
6586
Date d'inscription
vendredi 28 décembre 2007
Statut
Contributeur
Dernière intervention
19 février 2023
449
5 mars 2015 à 03:08
5 mars 2015 à 03:08
Salut,
http://effbot.org/imagingbook/image.htm
Et donc, tu devrais écrire :
au lieu de
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 de
im2.putpixel((x,y), p[0],p[1],p[2])
5 mars 2015 à 03:31
5 mars 2015 à 03:39
Je te conseil de copier ton code ici pour nous le communiquer : https://pastebin.com/
Modifié par yobe le 5/03/2015 à 13:44
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 "
Modifié par SypayV le 5/03/2015 à 17:10
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 :
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 :
5 mars 2015 à 17:19
Merci pour ta réponse et tes conseils.