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

对于这个项目 ,我使用Windows API截图(处理多屏)并将其转换为PIL图像; 那么如果想要的话,我会在窗户周围加一个阴影。

我的问题是,截图实际上是窗口的矩形; 这意味着我捕捉到它背后的背景,我不想要。 我GOOGLE了很多,find了透明度的文件和内容,我猜我应该find一种方法来获得窗口的形状,以使其成为一个面具,我将适用于(矩形)图像我已经得到。 但是现在我发现了那个面具。 任何人都可以帮忙吗?

以下是我的代码:

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 

以下是蓝色背景上方的窗口的略微放大的屏幕截图:

你可以看到有蓝色的angular落不应该在那里。

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