Tag: gdi

在Windows 10版本1703(15063.138)上bitblt失败

使用Visual Studio 2017,vc141,下面的代码应该从前面的游戏窗口获得截图,但现在它返回一个黑色和空白的图像。 只发行游戏(试过OpenGL和Vulkan,ogl返回黑色,vulkan返回白色) 在升级到Windows 10 1703之前,它适用于Windows 10 1607和Windows 7 sp1 #include #include #include 码: BOOL ScreenShot(cv::Mat *img, HWND hWnd = NULL) { HBITMAP hBitmap; HDC hdcSys = GetDC(hWnd); HDC hdcMem = CreateCompatibleDC(hdcSys); void *ptrBitmapPixels; BITMAPINFO bi; HDC hdc; RECT rect; if (!GetWindowRect(hWnd, &rect) || (hWnd == NULL)) { return FALSE; } ZeroMemory(&bi, sizeof(BITMAPINFO)); LONG […]

如何确定DIB是自下而上还是自上而下?

如果我使用CreateDIBSection()创建一个DIB,我可以通过将BITMAPINFOHEADER结构的biHeight字段设置为负值或正值来指定它应该是自顶向下还是自底向上。 但是,如果我在这样的位图上调用GetObject()来填充DIBSECTION结构,那么dsBm.bmHeight和dsBmih.biHeight似乎总是正数。 当我拥有的是HBITMAP时,有没有办法找出DIB是自上而下还是自下而上?

Win32(GDI) – 设置静态控制的不透明度

我正在使用C – (没有MFC或GDI +) 🙂 我想要的是将我的子窗口的不透明度设置为100(我的子窗口是STATIC控件)。 我想知道这是否可能,如果是这样,有人请指出我正确的方向如何做到这一点。 这是我的设置: 我创建我的父窗口如下: HWND hWnd; WNDCLASS wndCls_s; wndCls_s.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; wndCls_s.lpfnWndProc = MainWndProc; wndCls_s.cbClsExtra = 0; wndCls_s.cbWndExtra = 0; wndCls_s.hInstance = hInstance; wndCls_s.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_BSN_64)); wndCls_s.hCursor = LoadCursor(NULL, IDC_ARROW); wndCls_s.hbrBackground = CreateSolidBrush(RGB(0, 0, 0)); wndCls_s.lpszMenuName = NULL; wndCls_s.lpszClassName = pszCName; if (RegisterClass(&wndCls_s) == 0) […]

获取屏幕当前颜色filter的颜色

以下代码将屏幕的滤色器设置为特定颜色。 我怎样才能获得屏幕的颜色? [DllImport(“GDI32.dll”)] private unsafe static extern bool SetDeviceGammaRamp(IntPtr hdc, void* ramp); private static IntPtr hdc; public unsafe bool SetLCDbrightness(Color c) { short red = cR; short green = cG; short blue = cB; Graphics gg = Graphics.FromHwnd(IntPtr.Zero); hdc = gg.GetHdc(); short* gArray = stackalloc short[3 * 256]; short* idx = gArray; short brightness = […]

什么是优秀的C / C ++算法,用于通过抖动将24位位图转换为16位?

我一直在寻找一种优化(即快速)算法,该算法使用抖动将24位RGB位图转换为16位(RGB565)位图。 我正在寻找C / C ++中的东西,我可以实际控制如何应用抖动。 GDI +似乎提供了一些方法,但我不知道它们是否会抖动。 并且,如果他们做了抖动,他们使用什么机制(Floyd-Steinberg?) 有没有人有一个很好的位图颜色深度转换与抖动的例子?

如何为32位位图生成单色位掩码

在Win32下,通过执行以下操作,从位图生成单色位掩码以实现透明度使用是一种常见技术: SetBkColor(hdcSource, clrTransparency); VERIFY(BitBlt(hdcMask, 0, 0, bm.bmWidth, bm.bmHeight, hdcSource, 0, 0, SRCCOPY)); 这假设hdcSource是一个保存源图像的内存DC,而hdcMask是一个内存DC,它保存相同大小的单色位图(因此两者都是32×32,但源是4位颜色,而目标是1位单色)。 但是,当源为32位颜色+ alpha时,这对我来说似乎失败了。 我得到的是一个全黑的面具,而不是在hdcMask中获得单色位图。 没有位设置为白色(1)。 而这适用于4位彩色光源。 我的搜索foo失败了,因为我似乎找不到任何对这个特定问题的引用。 我已经发现这确实是我的代码中的问题:即如果我使用16色(4位)的源位图,它可以工作; 如果我使用32位图像,它会产生全黑色蒙版。 在32位彩色图像的情况下,我应该使用另一种方法吗? alpha通道是否存在覆盖上述技术正常行为的问题? 感谢您提供的任何帮助! ADDENDUM:我仍然无法找到为我的GDI +生成的源位图创建有效单色位图的技术。 我有点缓解了我的特殊问题,根本就是根本不生成单色位掩码,而是我正在使用TransparentBlt(),这似乎是正确的(但我不知道他们在内部做了什么,这是任何不同的允许他们正确掩盖图像)。 拥有一个非常好的,有效的function可能是有用的: HBITMAP CreateTransparencyMask(HDC hdc, HBITMAP hSource, COLORREF crTransparency); 无论hSource的颜色深度如何,它始终会创建有效的透明蒙版。 想法?

如何使用“工具提示”捕获屏幕?

我正在使用GDI捕获屏幕,我注意到屏幕截图中没有包含“工具提示”。 这是我的基本代码: HDC hdcDesk = GetDC(0); HDC hdcMem = CreateCompatibleDC(hdcDesk); HBITMAP hbmMem = CreateCompatibleBitmap(hdcDesk, 1920, 1080); SelectObject(hdcMem, hbmMem); StretchBlt(hdcMem, 0, 0, 1920, 1080, hdcDesk, 0, 0, 1920, 1080, SRCCOPY); // Now save the bitmap… 可以修复,还是应该使用其他方法捕获屏幕(GDI除外)? 编辑: 这是我拍摄的截图,不显示工具提示。