首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用Python PIL和windows API的活动窗口截图:如何处理圆角?

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

Stack Overflow用户
提问于 2011-05-14 08:20:01
回答 1查看 3.6K关注 0票数 16

对于this project,我使用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

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

正如你所看到的,有一些蓝色的角落是不应该出现的。

EN

回答 1

Stack Overflow用户

发布于 2012-06-25 17:18:46

为什么不使用Edge detection算法(f.e.Prewitt或Sobel)要检测窗口边缘,您只需将alpha通道设置为图像限制和窗口边缘限制之间的像素。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5999007

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档