高效绘制屏幕截图中每个像素的方法
高效绘制屏幕截图中每个像素的方法
基本上,我正在对屏幕进行截图并将格式转换为RGB格式。之后,我有两个for循环来遍历每个像素并将正确的颜色绘制到像素中。我的程序运行正常,但非常缓慢......有没有一种方法可以加快速度?
以下是代码:
from PIL import ImageGrab from graphics import * win = GraphWin('screenshot',1000,1000) def draw(): for y in range(1000): for x in range(1000): r, g, b = rgb_img.getpixel((x,y)) head = Circle(Point(x,y),1) head.setFill(color_rgb(r,g,b)) head.setWidth(0) head.draw(win) while True: img = ImageGrab.grab() rgb_img = img.convert('RGB') draw()
admin 更改状态以发布 2023年5月22日
您可以尝试使用多线程来加快速度
from PIL import ImageGrab from graphics import * import numpy as np from threading import Thread win = GraphWin('screenshot',1000,1000) def draw(pixel_ranges): for y in pixel_ranges: for x in pixel_ranges: r, g, b = rgb_img.getpixel((x,y)) head = Circle(Point(x,y),1) head.setFill(color_rgb(r,g,b)) head.setWidth(0) head.draw(win) num_threads = 10 image_size = 1000 pixel_splits = np.split(np.arange(1000),num_threads) n_threads = [] img = ImageGrab.grab() rgb_img = img.convert('RGB') for t in range(num_threads): thread = Thread(target = draw, args = (pixel_splits[t],)) thread.start() n_threads.append(thread) for t in n_threads: t.join()
基本上,我在这里做的是使用np.arange()创建从0到1000的像素列表,并将该列表分成10个相等的部分,然后创建10个线程,负责填充其范围内的像素,因此线程0获取像素0-100,线程1获取像素100-200等等,这应该可以显著提高您的性能
编辑:线程数越多,代码运行速度越快,但请注意:如果您有4个CPU插槽,每个CPU最多可以有12个内核,每个内核可以有两个线程。您的最大线程数为4 CPU x 12个内核 x 2个线程每个内核,因此12 x 4 x 2为96。因此,最大线程数为96,最大内核数为48,超过或接近此线程数可能使您的计算机烧毁。