python tkinter:如何使用像素?

Alb*_*lla 18 python image tkinter pixel

使用谷歌(和这个网站)我看到了一些类似的问题,但我的问题仍然存在:

"我想绘制一个图像(不读取文件),能够操纵该图像中每个像素的颜色."

我看到另一个问题,建议做这样的事情:

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()
Run Code Online (Sandbox Code Playgroud)

事实上,这回答了我的问题,但......这是非常缓慢的.我应该怎么做1920x1080图像?等我死?

所以我要求的东西与上面的代码相同,但速度更快

我找到了一种方法来改进jsbueno建议的方法,它在页面链接中解释:

为什么Photoimage放慢了?

jsb*_*eno 33

它确实很棘手 - 我认为你必须使用Canvas小部件,但它也无法访问Pixels.但是,嵌入在Canvas中的图像项目确实有.Tkinter.PhotoImage类有一个"put"方法,它接受十六进制格式和像素坐标的颜色:

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()
Run Code Online (Sandbox Code Playgroud)

好消息是,即使以这种方式完成,更新也是"实时":您在图像上设置像素,并看到它们显示在屏幕上.


这应该比在屏幕上绘制更高级别的线条的速度快得多 - 但是对于大量像素,它仍然会很慢,因为每个像素需要一个Python函数调用.任何其他纯粹的python直接操作像素的方式都会受到影响 - 唯一的出路是调用基元,这些基元在Python代码的本机代码中一次操作几个像素.

一个很好的跨平台库可以获得2d绘图,但是有很少的文档也是开罗 - 它应该有比Tkinter的Canvas或PhotoImage更好的原始图形.

  • 好吧 - 如果答案合适,您随时可以接受。如果您反对创建 Gane,我建议使用预制图像,并按照 http://stackoverflow.com/questions/12250117/how-to-draw-images-in 在 Tkinter Canvas 上移动图像-tkinter窗口/12254442#12254442 (2认同)

Eri*_*Red 7

不要忘记在canvas.create_image之后保存引用。在某些情况下,特别是在使用 PIL 模块时,Python 会垃圾收集图像,即使它正在显示!语法是这样的 canvas.create_image((WIDTH/2, HEIGHT/2), image=img) canvas.image = img