Эффективный способ рисования каждого пикселя скриншота - PullRequest
0 голосов
/ 21 октября 2018

Итак, в основном, я делаю скриншот своего экрана и преобразовываю формат в формат 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 голосов
/ 21 октября 2018

Вы можете попробовать многопоточность, чтобы сделать это быстрее

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()

В основном, что я делаю здесь, я создаю список пикселей от 0 до 1000, используя np.arange () и разделяя этот списокзатем на 10 равных частей мы создаем 10 потоков, которые отвечают за заполнение пикселей в их диапазоне, поэтому поток 0 получает пиксели 0-100, поток 1 получает пиксели 100-200 и т. д., это должно значительно повысить производительность

РЕДАКТИРОВАТЬ: Чем больше потоков, тем быстрее будет работать ваш код, но будьте осторожны: если у вас есть 4 сокета ЦП, каждый ЦП может иметь до 12 ядер, а каждое ядро ​​может иметь два потока.Максимальное количество потоков составляет 4 ЦП x 12 ядер x 2 потока на ядро, поэтому 12 x 4 x 2 равно 96. Следовательно, максимальное число потоков равно 96, а максимальное число ядер равно 48, превышение этого значения или сближение с этим числом потоков может привести кжарь свою машину,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...