widgets entry python image tkinter pixel

entry - Python tkinter: ¿cómo trabajar con píxeles?



tkinter python 3 (2)

utilizando google (y este sitio) he visto algunas preguntas similares pero mi problema sigue aquí:

"Quiero dibujar una imagen (sin leer un archivo), pudiendo manipular el color de cada píxel en esa imagen".

He visto otra pregunta donde se sugirió hacer algo como esto:

from tkinter import * A=Tk() B=Canvas(A) B.place(x=0,y=0,height=256,width=256) for a in range(256): for b in range(256): B.create_line(a,b,a+1,b+1,fill=pyList[a][b])#where pyList is a matrix of hexadecimal strings A.geometry("256x256") mainloop()

de hecho, esto responde a mi pregunta pero ... es extremadamente lento. ¿Qué debo hacer con una imagen de 1920x1080? esperar mi muerte?

así que estoy pidiendo algo para realizar lo mismo que el código anterior pero de una manera más rápida

He encontrado una manera de mejorar el método sugerido por jsbueno, se explica en la página enlazada:

¿Por qué se pone lento Photoimage?


De hecho, es complicado: pensé que tenías que usar un widget de Canvas, pero eso tampoco tiene acceso a Pixels. Sin embargo, los elementos de imagen incrustados en el lienzo sí tienen. La clase Tkinter.PhotoImage tiene un método de "poner" que acepta un color en formato hexadecimal y coordenadas de píxeles:

from Tkinter import Tk, Canvas, PhotoImage, mainloop from math import sin WIDTH, HEIGHT = 640, 480 window = Tk() canvas = Canvas(window, width=WIDTH, height=HEIGHT, bg="#000000") canvas.pack() img = PhotoImage(width=WIDTH, height=HEIGHT) canvas.create_image((WIDTH/2, HEIGHT/2), image=img, state="normal") for x in range(4 * WIDTH): y = int(HEIGHT/2 + HEIGHT/4 * sin(x/80.0)) img.put("#ffffff", (x//4,y)) mainloop()

La buena noticia es que incluso si se hace de esta manera, las actualizaciones son "en vivo": establece los píxeles en la imagen y los ve en la pantalla.

Esto debería ser mucho más rápido que la forma en que se dibujan líneas de mayor nivel en la pantalla, pero para muchos píxeles seguirá siendo lento, debido a una llamada a la función Python necesaria para cada píxel. Cualquier otra forma pura de Python de manipular píxeles directamente sufrirá por ello: la única salida es llamar primitivos que manipulen varios píxeles a la vez en el código nativo de su código Python.

Una buena biblioteca multiplataforma para obtener dibujos en 2D, por muy mal documentado que sea Cairo, debería tener primitivos mucho mejores que Tkinter''s Canvas o PhotoImage.


No olvides guardar una referencia después de canvas.create_image. En algunos casos, especialmente cuando se trabaja con el módulo PIL, Python recolectará la imagen de manera inútil, aunque se muestre. La sintaxis es algo así como canvas.create_image((WIDTH/2, HEIGHT/2), image=img) canvas.image = img