使用Python PIL和Windows API进行活动窗口截图:如何处理圆角?

16
对于这个项目,我使用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
"""http://stackoverflow.com/questions/4199497/image-frombuffer-with-16-bit-image-data"""
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

以下是一个略微放大的窗口截图,背景为蓝色:

如您所见,有些不该出现的蓝色角落。


我仍然找不到解决方案。有人吗? - NorthernLights
3
事实上,我从未找到过一款成功处理窗口截图的软件,即使是微软提供的SnippingTool.exe也不行。尝试剪切2个像素或者将其变为2个纯黑/白像素。如果你想要精确地剪裁形状,请查阅微软文档:窗口角落的形状是由系统的RadiusX/RadiusY定义的。http://msdn.microsoft.com/en-us/library/system.windows.shapes.rectangle.radiusy.aspx#Y0 - fanlix
相似的问题?https://dev59.com/X3E95IYBdhLWcg3wn_f2 - notbad.jpeg
1个回答

1
为什么不使用边缘检测算法(例如Prewitt或Sobel)来检测窗口边缘,您只需要将alpha通道设置为图像限制和窗口边缘限制之间的像素即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接