Обрезать растровое изображение в памяти с помощью Pywin32 - PullRequest
0 голосов
/ 20 мая 2018

Я пытаюсь сделать снимок экрана моего рабочего стола на нескольких мониторах с помощью pywin32.

У меня есть скриншот, который мне нужен на третьем мониторе, но мне нужна только определенная область изображения.

Я могу обрезать его, когда сохраняю растровое изображение на жесткий диск, например:

# initial set up code hooking up pywin32 to the desktop

import win32gui, win32ui, win32con, win32api
hwin = win32gui.GetDesktopWindow()

# example dimensions
width = 800
height = 600
left = 3300
top = 100

hwindc = win32gui.GetWindowDC(hwin)
srcdc = win32ui.CreateDCFromHandle(hwindc)
memdc = srcdc.CreateCompatibleDC()
bmp = win32ui.CreateBitmap()
bmp.CreateCompatibleBitmap(srcdc, width, height)
memdc.SelectObject(bmp)

# saving of the file (what I am currently doing)
bmp.SaveBitmapFile(memdc, 'fullshot.bmp')

# strangely enough this crops the portion I need, 
# but within an image that's the entire length of my desktop
# (not sure how to fix that, you could say this is part of the problem)
memdc.BitBlt((0, 0), (width, height), srcdc, (left, top), win32con.SRCCOPY)


img = Image.open('fullshot.bmp')
img = img.crop((0,0,800,600))
# now the cropped image is in memory but I want just the portion I need without saving it to disk

bmp имеет тип PyCBitmap.Я пробовал np.array(bmp), но это тоже не работает.Есть ли способ взять bmp, скопированный pwin32, и обрезать его до нужных мне размеров в памяти программы?

обновление:

Я попробовал следующий код, который тоже не работает.Когда я пытаюсь отобразить его с помощью cv2.imshow('image', img), я получаю не отвечающее окно.

signedIntsArray = bmp.GetBitmapBits(True)
img = np.frombuffer(signedIntsArray, dtype='uint8')
img.shape = (height,width,4)

srcdc.DeleteDC()
memdc.DeleteDC()
win32gui.ReleaseDC(hwin, hwindc)
win32gui.DeleteObject(bmp.GetHandle())

cv2.imshow('image', img)

1 Ответ

0 голосов
/ 20 мая 2018

У меня была проблема не в том, что приведенный ниже код не работал:

signedIntsArray = bmp.GetBitmapBits(True)
img =  np.frombuffer(signedIntsArray, dtype='uint8')
img.shape = (h,w,4)

когда я отправил его в функцию cv2.imshow как cv2.imshow('image', np.array(img), я понял, что мне нужноустановить waitKey:

cv2.imshow('image', np.array(screen_grab()))
cv2.waitKey(0)
cv2.destroyAllWindows()

Это дало мне то, что я искал.Надеюсь, это поможет кому-то в будущем.

...