如何直接在屏幕上绘制一个像素?

16 投票
3 回答
46835 浏览
提问于 2025-04-17 03:16

我想做一些类似下面的事情:

...
pixel[0,0] = [ 254, 0, 0 ] # Draw R at pixel x0y0
pixel[2,1] = [ 0, 254, 0 ] # Draw G at pixel x2y1
pixel[4,2] = [ 0, 0, 254 ] # Draw B at pixel x4y2
...

我希望在短时间内显示很多不同的像素和颜色配置——如果写入一个中间文件,那样会太耗费资源。

我应该如何在Python中最好地实现这个目标呢?

3 个回答

3

我不太确定我是否理解你的问题,但我觉得你应该看看一些框架或者中间件,这些工具可以让你访问屏幕。我推荐你试试PyGame、Pyglet,或者甚至Panda。可能这些工具有点复杂,因为PyGame和Panda是用来开发游戏的框架,而Pyglet是Python中对OpenGL的封装,但它们可以让你轻松控制像素、窗口等东西。

4

虽然这并不是你说的那样(逐个像素绘制),但我喜欢用Python、GTK和Cairo来做这件事。

在这种情况下,你需要创建一个GTK窗口,添加一个绘图区域,然后创建一个Cairo上下文,接着就可以进行绘制操作了。

这里的不同之处在于,你有一个连续的画布,坐标是浮点数,而不是像素。你可以用线条和填充来绘制几何形状。你甚至可以绘制一个一像素大小的矩形并填充它,但这样做速度会比较慢。

另外,你可以一次性处理任何栅格对象(比如图像或像素缓冲区),然后快速生成一系列图像,并一次性渲染它们的像素,这就像在播放电影一样。

你可以在之前的回答中看到一个工作示例(第二段代码): 快速入门Cairo的方法

28

直接回答:

这个操作只能通过特定操作系统的接口来实现。有些操作系统不允许直接改变屏幕上的像素。

在Windows系统上,你可以使用pywin32库,通过调用dc = GetDC(0)来获取屏幕的设备上下文,然后用SetPixel(dc, x, y, color)来绘制像素。

import win32gui
import win32api

dc = win32gui.GetDC(0)
red = win32api.RGB(255, 0, 0)
win32gui.SetPixel(dc, 0, 0, red)  # draw red at 0,0

当然,你用这种方式绘制的内容随时都可能被擦掉。

正确的回答:

逐个像素绘制是最慢的绘图方式。例如,在Windows上,先在内存中创建一张图像,然后一次性绘制出来,这比用SetPixel逐个绘制快得多。

如果你需要速度,可以使用一些Python的用户界面库,比如Tkinter模块或PyQt。先创建一个窗口和内存中的图像,然后把图像绘制到窗口上。如果需要处理像素,就在图像中处理它们,每次都重新绘制。

撰写回答