Articles of gdi +

在GDI +中发生了一个通用错误

我有一个传统的Winforms应用程序,使用它时,造成一些奇怪的问题。 应用程序部分处理图像,用户可以将图像添加到logging,这些图像在.Net中resize,并保存到服务器共享。 我有两个使用这个应用程序的问题,都导致“GDI +中发生一般性错误”。 用户可以查看logging,图像显示正常,可以尝试打印,出现select打印机的对话框,但是当点击打印时,出现错误。 另一个是当用户尝试添加一个新的图像到一个logging,相同的一般错误。 最好的部分 – 只有两个用户有这个问题。 图像可以直接从共享打开并打印出来,没问题。 这两个用户都是同一个AD组的一部分,其他人都拥有对共享/文件的权限。 两个用户login到另一台机器上的应用程序,并做同样的工作正常。 我试过让两个人完全控制和共享文件的所有权,但仍然是相同的错误。 卸载并重新安装应用程序不起作用。 我已经login到每个受影响的用户机器和应用程序安装在每个用户的基础上,但在我的凭据在同一台计算机上安装和运行的应用程序运行良好。 任何人都有这个问题的经验,或者我应该尝试下一步? 编辑:这一切都开始时,我们将共享文件夹移动到另一台服务器。

问题与CreateDC和wglMakeCurrent

PIXELFORMATDESCRIPTOR pfd = { /* otherwise fine for a window with 32-bit color */ }; HDC hDC = CreateDC(TEXT("Display"),NULL,NULL,NULL); // always OK int ipf = ChoosePixelFormat(hDC,&pfd); // always OK SetPixelFormat(hDC,ipf,&pfd); // always OK HGLRC hRC = wglCreateContext(hDC); // always OK wglMakeCurrent(hDC,hRC); // ! read error: 0xbaadf039 (debug, obviously) 但是下面的作品与hRC相同: wglMakeCurrent(hSomeWindowDC,hRC); 以上是Windows的OpenGL 3.0+初始化系统的一部分。 我试图避免为了美观而创build一个虚拟的窗口。 我之前从未使用过CreateDC,所以也许我错过了一些东西。 编辑:hSomeWindowDC将指向一个适当的像素格式的窗口DC。 […]

用GDI +和C ++减less闪烁

我在C ++ / MFC应用程序中使用GDI +,而且我无法避免在窗口大小调整的情况下闪烁。 我已经尝试了这些步骤: OnEraseBkGnd()返回TRUE; 在OnCtlColor()上返回NULL; 根据这个代码使用双缓冲: void vwView::OnDraw(CDC* pDC) { CRect rcClient; GetClientRect(rcClient); Bitmap bmp(rcClient.Width(), rcClient.Height()); Graphics graphics(&bmp); graphics.DrawImage(m_image, rcClient.left, rcClient.top); Graphics grph(pDC->m_hDC); grph.DrawImage(&bmp, 0, 0); } 难道我做错了什么? 或者有另一种方法来实现这一目标?

使用UpdateLayeredWindow将部分透明的GDI +位图绘制到无边框窗口

我正在尝试创build一个半透明像素的非矩形窗口。 该图像不是来自PNG,而是使用GDI +调用即时绘制的。 我创build窗口如下: WNDCLASSEX wc = WNDCLASSEX(); wc.cbSize = sizeof(wc); HINSTANCE instance = GetModuleHandle(nullptr); std::wstring classname(L"gditest ui window class"); if (!GetClassInfoEx(instance, classname.c_str(), &wc)) { //wc.cbSize; //wc.style = CS_DROPSHADOW; wc.lpfnWndProc = process_messages; //wc.cbClsExtra; //wc.cbWndExtra; wc.hInstance = instance; wc.hIcon; wc.hCursor = LoadCursor(0, IDC_ARROW); //wc.hbrBackground; //wc.lpszMenuName; wc.lpszClassName = classname.c_str(); wc.hIconSm; if (!RegisterClassEx(&wc)) throw GetLastError(); } m_window = […]

使用GDI +和C ++将JPEG编码的屏幕截图转换为缓冲区

我已经从SO的另一篇文章中修改了这段代码。 它将桌面截图并将其写入名为“test.jpg”的文件。 我有兴趣将JPEG数据直接保存到要通过networking发送的缓冲区中。 我很确定GdipSaveImageToStream是我所需要的,但我无法弄清楚它是如何工作的。 GpImage参数特别混乱。 我感谢您可以提供的任何帮助。 #include "stdafx.h" #include "windows.h" #include "gdiplus.h" using namespace Gdiplus; using namespace Gdiplus::DllExports; int GetEncoderClsid(WCHAR *format, CLSID *pClsid) { unsigned int num = 0, size = 0; GetImageEncodersSize(&num, &size); if(size == 0) return -1; ImageCodecInfo *pImageCodecInfo = (ImageCodecInfo *)(malloc(size)); if(pImageCodecInfo == NULL) return -1; GetImageEncoders(num, size, pImageCodecInfo); for(unsigned int j […]

Gdiplus :: Bitmap :: FromHICON是否正确处理“黑白图标”?

如MSDN ICONINFO中所述 ,根据结构是否定义黑白图标, hbmMask和hbmColor的格式不同。 hbmMask types:HBITMAP 图标位掩码位图。 如果此结构定义了黑白图标,则此位掩码将被格式化,以使上半部分为图标AND位掩码,下半部分为图标XOR位掩码。 在这种情况下, 高度应该是两倍的偶数 。 如果这个结构定义了一个颜色图标,这个掩码只定义了图标的AND位掩码。 这意味着我们需要检测hbmColor的存在来正确计算图标的高度。 但是,后来我注意到Gdiplus::Bitmap::FromHICON() ,它接受HICON并将其转换为Gdiplus::Bitmap 。 由于我没有看到有关GDI +中“黑白”图标的任何材料,这种方法是否在内部处理这种情况? (不幸的是,我没有一个方便的testing图标,我也不知道如何创build一个正确的testing用例。)

使用Win32 API查找图标资源中的图标数量

我有一个* .ico文件,其中包含与我的可执行文件链接的不同大小的多个图标作为资源。 我使用这个资源来设置我的应用程序的图标与RegisterClassEx() , 即 wcx.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1)); 除此之外,我还想将这个资源中的所有单个图标转换为ARGB像素数组。 这应该可以通过使用GetIconInfo()返回的位图上的GetDIBits() GetIconInfo() 。 但是,有一个问题:我需要找出LoadIcon()返回的HICON句柄中的图标数量及其大小。 我似乎没有find需要HICON句柄的API,并告诉我在那里有多less图标,以及它们的大小是多less。 这是否有可能以某种方式,或者我需要去困难的方式和parsing* .ico资源我自己?

有更快的替代GDI GetPixel()?

我在.NET应用程序中使用gdi32.dll中的GetPixel()来对屏幕上任意位置的像素进行采样。 它工作正常,但它是我的主要性能瓶颈。 有没有更快的方法呢?

以编程方式将CFF字体转换为OpenType字体

有没有人有任何指针,我可以find额外的信息,如何创buildCFF字体的opentype包装? 目前我有一个CFF文件的parsing器,所以我可以从中获得各种信息(cmap,字形名称,宽度,名称等)。 鉴于此信息,我无法创build一个Opentype(truetype格式)包装,所以我可以使用GDI Windows上的字体; GDI不会加载Opentype字体,我唯一知道的是它无法加载字体。 有谁知道任何额外的信息,validation应用程序,示例代码,获取额外的信息,为什么不从Windows等加载字体? 注:我正在寻找信息如何做,而不是公用事业和/或转换工具。

C ++ / Win32:如何从HBITMAP获取alpha通道?

我有一个包含alpha通道数据的HBITMAP 。 我可以成功地使用::AlphaBlend GDI函数来渲染。 但是,当我调用::GetPixel GDI函数时,我永远不会用alpha组件返回值。 该文件确实说它返回像素的RGB值。 有没有办法检索HBITMAP像素的alpha通道值? 我希望能够检测何时使用:: AlphaBlend,以及何时使用旧式方法将源HBITMAP中的特定颜色视为透明。 HDC sourceHdc = ::CreateCompatibleDC(hdcDraw); ::SelectObject(sourceHdc, m_hbmp); // This pixel has partial transparency, but ::GetPixel returns just RGB. COLORREF c = ::GetPixel(sourceHdc, 20, 20); // Draw the bitmap to hdcDraw BLENDFUNCTION bf1; bf1.BlendOp = AC_SRC_OVER; bf1.BlendFlags = 0; bf1.SourceConstantAlpha = 0xff; bf1.AlphaFormat = AC_SRC_ALPHA; ::AlphaBlend(di.hdcDraw, x, […]