Уведомления

Группа в Telegram: @pythonsu

#1 Июль 1, 2019 23:02:31

vladmen
Зарегистрирован: 2019-07-01
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Замедляется выполнения цикла for

Питон 3,4
Здравствуйте. Такая проблема. Хочу прочитать значение всех пикселей экрана (принтом в терминал или в тхт файл, не важно). Приоритет именно на скорость. Код выполняется но постепенно замедляясь . .. и где-то после 10 000 пикселей выдает ошибку «pywintypes.error: (0, ‘GetPixel’, ‘No error message is available’)». Я так понимаю перегружается оператива , или просто идет захламление в коде устаревшими данными, как отдавать оперативу обратно системе толком не понял. Пытался использовать dc.collect() , но толе я его не так юзаю, толе он тут не помогает. Подскажите пожалуйста , как исправить код чтобы можно было прочитать всех пиксели экрана без ошибок и замедлений.

 import win32gui
def pixel_color_at(x, y):
    hdc = win32gui.GetWindowDC(win32gui.GetDesktopWindow())
    c = int(win32gui.GetPixel(hdc, x, y))
        # (r, g, b)
    return (c & 0xff), ((c >> 8) & 0xff), ((c >> 16) & 0xff) #преобразование в RGB
y=0
for i in range(1,760):# по x
    x=0
    y=y+1
    for i in range (1,1300): # по у
        x=x+1
        pixel = pixel_color_at(x,y)
        print (pixel,x)

Офлайн

#2 Июль 2, 2019 08:18:53

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Замедляется выполнения цикла for

vladmen
Приоритет именно на скорость.
Тот у кого приоритет скорость не будет делать принт на консоль, тем более в винде.
Нормальное решение в первой же ссылке. https://stackoverflow.com/questions/2846947/get-screenshot-on-windows-with-python

 import wx
wx.App()  # Need to create an App instance before doing anything
screen = wx.ScreenDC()
size = screen.GetSize()
bmp = wx.EmptyBitmap(size[0], size[1])
mem = wx.MemoryDC(bmp)
mem.Blit(0, 0, size[0], size[1], screen, 0, 0)
del mem  # Release bitmap
bmp.SaveFile('screenshot.png', wx.BITMAP_TYPE_PNG)

 from mss import mss
with mss() as sct:
    sct.shot()

vladmen
выдает ошибку
Если вы взялись работать с низкоуровневыми интерфейсами ОС то работать надо по их правилам. Питон тут не виноват и никакая сборка мусора не поможет. Скорее всего вы истощили ресурсы ОС по количеству контекстов. WindowDC надо освобождать после использования.



Офлайн

#3 Июль 2, 2019 13:05:30

vladmen
Зарегистрирован: 2019-07-01
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Замедляется выполнения цикла for

Большое спасибо за ответ Попробую внедрить Ваше замечание

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version