À l'aide du DIP du Module ImageDraw
Je suis en train de faire de pixels individuels de manipulation à l'aide de PIL est ImageDraw Module. Le code soufflet est censé créer Tkinter toile widget. Ensuite, ouvrez une image, modifier un pixel de couleur rouge, puis d'intégrer l'image dans le canevas widget. Cependant, il ne semble pas fonctionner.
Mon Code:
import Tkinter
from PIL import ImageTk, Image, ImageDraw
class image_manip(Tkinter.Tk):
def __init__(self):
Tkinter.Tk.__init__(self)
self.configure(bg='red')
self.ImbImage = Tkinter.Canvas(self, highlightthickness=0, bd=0, bg='blue')
self.ImbImage.pack()
im = Image.open(r'C:\Python26\Suite\test.png')
print im.format, im.size, im.mode
im = ImageDraw.Draw(im)
im = im.point((0, 0), fill="red")
self.i = ImageTk.PhotoImage(im)
self.ImbImage.create_image(139, 59, image=self.i)
def run():
image_manip().mainloop()
if __name__ == "__main__":
run()
J'obtiens l'erreur suivante lors de l'exécution de mon code:
Exception AttributeError: "PhotoImage instance has no attribute '_PhotoImage__photo'" in <bound method PhotoImage.__del__ of <PIL.ImageTk.PhotoImage instance at 0x05DF7698>> ignored
Traceback (most recent call last):
File "<string>", line 245, in run_nodebug
File "C:\Python26\Suite\test_image.py", line 30, in <module>
run()
File "C:\Python26\Suite\test_image.py", line 28, in run
image_manip().mainloop()
File "C:\Python26\Suite\test_image.py", line 20, in __init__
self.i = ImageTk.PhotoImage(im)
File "C:\Python26\lib\site-packages\PIL\ImageTk.py", line 109, in __init__
mode = Image.getmodebase(mode)
File "C:\Python26\lib\site-packages\PIL\Image.py", line 245, in getmodebase
return ImageMode.getmode(mode).basemode
File "C:\Python26\lib\site-packages\PIL\ImageMode.py", line 50, in getmode
return _modes[mode]
KeyError: None
OriginalL'auteur rectangletangle | 2011-01-31
Vous devez vous connecter pour publier un commentaire.
Votre problème est que vous êtes réaffectation des
im
à plusieurs choses.Lorsque vous appelez
ImageTk.PhotoImage(im)
, la fonction attend un PIL de l'image de l'objet, mais vous avez déjà attribuéim
à la suite de lapoint()
fonction, qui renvoie en faitNone
. C'est la cause de votre problème.Je pense que vous êtes l'incompréhension comment ImageDraw œuvres. Jetez un oeil ici pour un exemple. En gros:
ImageDraw
si vous voulez dessiner quelque chose de compliqué sur votre Image de PILImageDraw
peint directement sur l'image que vous avez donné lors de la construction du tempsImageDraw
objet à tout moment. Il ne contient pas toutes les informations importantes parce que tout est écrit directement à l'image.Voici le fixe
__init__
méthode:Vous remarquerez que j'ai corrigé un certain nombre de choses:
ImageDraw
exemple pour une variable distinctedraw.rectangle
-- il retourne en faitNone
, comme la plupart des autres fonctions de dessin de le faire.draw
variable après que nous aurons terminé le dessincreate_image
Notez que vous DEVEZ attribuer le ImageTk.PhotoImage(im) à la une persistantes (non garbage collector) de la variable. Il y a un bug dans Tkinter, où l'image sera ordures sont collectées que si vous venez de l'affecter à une variable locale et de l'utiliser dans create_image. Voir infohost.nmt.edu/tcc/help/pubs/pil/image-tk.html.
OriginalL'auteur mpenkov