Скриншот активного окна с Python PIL и Windows API: как бороться с закругленными углами? - PullRequest
16 голосов
/ 14 мая 2011

Для этого проекта я делаю снимки экрана с Windows API (для работы с несколькими экранами) и преобразую его в изображение PIL;затем я добавляю тень вокруг окна, если это необходимо.

Моя проблема в том, что скриншот на самом деле представляет собой прямоугольник окна;это означает, что я делаю фон за этим вокруг закругленных углов, и я не хочу этого.Я немного погуглил и нашел документы и прорези прозрачности, и я предполагаю, что должен найти способ получить форму окна, чтобы сделать его маской, которую я применил бы к (прямоугольному) изображению, которое у меня есть.получил.Но сейчас я нашел эту маску.Может ли кто-нибудь помочь?

Ниже мой код:

hwnd = win32gui.GetForegroundWindow()

l, t, r, b = win32gui.GetWindowRect(hwnd)
w = r - l
h = b - t

hwndDC = win32gui.GetWindowDC(hwnd)
mfcDC  = win32ui.CreateDCFromHandle(hwndDC)
saveDC = mfcDC.CreateCompatibleDC()

saveBitMap = win32ui.CreateBitmap()
saveBitMap.CreateCompatibleBitmap(mfcDC, w, h)
saveDC.SelectObject(saveBitMap)

saveDC.BitBlt((0, 0), (w, h),  mfcDC,  (0, 0),  win32con.SRCCOPY)

#add cursor
if showcursor:
    curFlags, curH, (curX, curY) = win32gui.GetCursorInfo()
    saveDC.DrawIcon((curX, curY), curH)

#load into PIL image
"""/4082702/image-frombuffer-s-16-bitnymi-dannymi-izobrazheniya"""
bmpinfo = saveBitMap.GetInfo()
bmpstr = saveBitMap.GetBitmapBits(True)
im = Image.frombuffer(
    'RGB',
    (bmpinfo['bmWidth'], bmpinfo['bmHeight']),
    bmpstr, 'raw', 'BGRX', 0, 1)

win32gui.DeleteObject(saveBitMap.GetHandle())
saveDC.DeleteDC()
mfcDC.DeleteDC()
win32gui.ReleaseDC(hwnd, hwndDC)

return im

Ниже немного увеличенный скриншот окна над синим фоном:

image

Как видите, синих углов не должно быть.

1 Ответ

1 голос
/ 25 июня 2012

Почему бы не использовать алгоритм обнаружения краев (например, Prewitt или Sobel) для обнаружения края окна, вам нужно всего лишь установить альфа-канал на пиксели между пределами изображения и границами окна.

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