首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >python tkinter:如何处理像素?

python tkinter:如何处理像素?
EN

Stack Overflow用户
提问于 2012-09-05 22:58:56
回答 2查看 33.4K关注 0票数 19

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

“我想画一个图像(不读取文件),能够操纵图像中每一个像素的颜色。”

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

代码语言:javascript
复制
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()

事实上这回答了我的问题但是..。它非常慢。我应该如何处理1920x1080图像?等着我死吗?

因此,我要求执行与上述代码相同的操作,但速度更快

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

Why is Photoimage put slow?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-06 01:54:41

这确实很棘手--我以为您必须使用Canvas小部件,但它也无法访问Pixels。不过,嵌入到画布中的图像项确实有。Tkinter.PhotoImage类确实有一个"put“方法,它接受十六进制格式的颜色和像素坐标:

代码语言:javascript
复制
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()

好消息是,即使这样做,更新也是“实时”的:您在图像上设置像素,然后看到它们显示在屏幕上。

这应该比在屏幕上绘制更高层次的线条要快得多-但对于很多像素来说,由于每个像素都需要一个Python函数调用,所以速度仍然会很慢。任何其他直接操作像素的纯python方法都会受到影响-唯一的解决方法是从Python代码中调用原生代码中一次操作几个像素的原语。

Cairo是一个很好的跨平台库,用来绘制2d图形,但是文档很少-它应该有比Tkinter的Canvas或PhotoImage更好的原语。

票数 37
EN

Stack Overflow用户

发布于 2016-12-25 18:01:12

别忘了在canvas.create_image之后保存一个引用。在某些情况下,特别是在使用PIL模块时,python将对图像进行垃圾收集,即使它正在显示!语法类似于canvas.create_image((WIDTH/2, HEIGHT/2), image=img) canvas.image = img

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12284311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档