你能从位图获得设备上下文吗?

时间:2014-01-02 20:43:32

标签: python winapi pywin32

我正在尝试研究如何在之后调整图像我将其转换为位图。从MSDN示例中,我能够弄清楚如何从 DC中调整(在它转换为位图之前)

# Big snapshot of the desktop
hwnd = win32gui.GetDesktopWindow()

zhwndDevice = win32gui.GetWindowDC(hwnd)
zmfcDC  = win32ui.CreateDCFromHandle(zhwndDevice)
zsaveDC = zmfcDC.CreateCompatibleDC()
zsaveBitMap = win32ui.CreateBitmap()
zsaveBitMap.CreateCompatibleBitmap(zmfcDC, width, height)
zsaveDC.SelectObject(zsaveBitMap)
zsaveDC.BitBlt((0, 0), (width, height), zmfcDC, (left, top), win32con.SRCCOPY)

# Creates a smaller bitmap and resizes the first image to fit it 
hwnd = win32gui.GetDesktopWindow()
hwndDevice = win32gui.GetWindowDC(hwnd)
mfcDC   = win32ui.CreateDCFromHandle(hwndDevice)
saveDC = mfcDC.CreateCompatibleDC()
saveBitMap = win32ui.CreateBitmap()
saveBitMap.CreateCompatibleBitmap(mfcDC, target_size[0], target_size[1])
saveDC.SelectObject(saveBitMap)
win32gui.StretchBlt(pywintypes.HANDLE(saveDC.GetHandleAttrib()), 0,0,target_size[0], target_size[1], zsaveDC.GetHandleAttrib(), 0,0,width, height, win32con.SRCCOPY)

我的问题是,如果我已经有一个Bitmap对象,我将如何从中创建一个DC,以便我可以将它传递给StretchBlt方法?

1 个答案:

答案 0 :(得分:2)

设备上下文的重点在于它是适用于某种设备的上下文 - 您的显示器,打印机等等。因此,为位图创建DC没有任何意义。请阅读Device Contexts了解更多详情。

如果您想创建一个与当前屏幕兼容的内存设备上下文,这正是您使用NULL(来自Python,None或{调用CreateCompatibleDC时获得的内容{1}},取决于您使用的包装器)作为0参数:

  

现有DC的句柄。如果此句柄为NULL,则该函数将创建与应用程序当前屏幕兼容的内存DC。

然而,在你的情况下,你最终试图把它搞定到你已经拥有DC的目标窗口(或其他一些目标),对吧?所以我认为你真正想要的是创建一个与 target DC兼容的内存DC,然后创建一个与该目标DC兼容的位图,然后将该位图选择到内存DC中。