绘制屏幕快照每个像素的有效方法

时间:2018-10-21 12:36:08

标签: python graphics

因此,基本上,我正在截屏并将其转换为RGB格式。之后,我有2个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()

1 个答案:

答案 0 :(得分:0)

您可以尝试多线程以使其更快

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,超过该数量或接近该线程数量可能炸机器,