高效绘制屏幕截图中每个像素的方法

13 浏览
0 Comments

高效绘制屏幕截图中每个像素的方法

基本上,我正在对屏幕进行截图并将格式转换为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日
0
0 Comments

您可以尝试使用多线程来加快速度

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,超过或接近此线程数可能使您的计算机烧毁。

0