BitBlt从剪贴板复制位图会给出错误的颜色
BitBlt Copy Bitmap from ClipBoard gives wrong colors
我正在将剪贴板中的图像粘贴到我的程序中。位图被放在背景memDC位图上,然后在绘制到屏幕之前与另一个memDC合成。背景位图为每像素8位。问题是位blt将黑色(0x00000000)变为几乎黑色(0x00010101)。如果我把同样的东西粘贴到MSPaint中,我就会变成黑色。如果我从MSPaint复制Black,我会得到Almost Black。(其他颜色也有破损)。如果我将背景位图更改为32bpp,我会得到正确的颜色,但这目前不是一个选项。
以下是演示该问题的一些代码:
/*
*HWND hWnd; // main window handle
*HDC hDC; // main window DC (set elsewhere)
*HDC memDC; // background DC (set elsewhere)
*/
HBITMAP hClipBitmap=NULL;
OpenClipboard(hWnd);
hClipBitmap = (HBITMAP)GetClipboardData(CF_BITMAP);
if (hClipBitmap!=NULL)
{
// I now want to make a copy of the bitmap
BITMAP bm;
HDC hSrcDC,hDestDC;
HANDLE OldObject1, OldObject2;
DWORD sz = GetObject(hClipBitmap, sizeof(BITMAP), &bm);
if(sz == sizeof(BITMAP))
{
// make a bitmap to allow positioning before actual pasting
hPasteBitmap = ::CreateCompatibleBitmap(memDC, bm.bmWidth, bm.bmHeight);
if (hPasteBitmap==NULL)
FATAL_ERROR;
hSrcDC = CreateCompatibleDC(hDC);
hDestDC = CreateCompatibleDC(hDC);
OldObject1 = SelectObject(hSrcDC, hClipBitmap); // bpp is 32
OldObject2 = SelectObject(hDestDC, hPasteBitmap); // bpp is 8
BitBlt(hDestDC, 0, 0, bm.bmWidth, bm.bmHeight, hSrcDC, 0, 0, SRCCOPY);
COLORREF color2 = ::GetPixel(hSrcDC, 1, 1); // color2 is 0x00000000
COLORREF color3 = ::GetPixel(hDestDC, 1, 1);// color2 is 0x00010101
COLORREF color4 = ::GetNearestColor(hSrcDC, color2); // 0x00000000
COLORREF color5 = ::GetNearestColor(hDestDC, color2);// 0x00000000
// hPasteBitmap now contains the clipboard data
}
}
// other cleanup snipped for clarity
使用GetPixel()和GetNearestColor(),我似乎应该得到我想要的结果,但我没有。我想我错过了某种调色板操作?
更新
我真正遇到的问题是,也许我误解了这些API的要点,我可以查询像素颜色,然后询问上下文它将使用什么颜色,它会返回正确的颜色(黑色),而不是BitBlt生成的"几乎黑色"。
其他程序似乎没有在剪贴板上放调色板——也许是因为他们放的是不需要调色板的32bpp位图?从MSDN的剪贴板翻译表中可以看出,他们甚至没有做DIB
每像素8位位图需要一个相关的调色板来指定颜色,这是单独的-您可以使用CF_PALETTE
从剪贴板中获得它。一旦有了它,就可以在位图所选的DC上使用SelectPalette
和RealizePalette
。
相关文章:
- 分段错误当我试图运行程序时出错
- .h 和.cpp文件分离时出错,但仅使用 .h 文件时没有错误.我做错了什么?
- 创建 OpenCV 非自由版本 v4.3 时出错,可折叠.cpp错误 C2039、2605
- 制作时出错,C++"db.c:2127:错误:在"||"标记之前应使用";"
- C++语法错误,编译器不会警告或 int v = func(&v) 出错;
- 在VS2015中访问类成员时运行时错误,但在Linux上未访问时出错
- 如何更改路径以修复错误"./main:加载共享库 libmkl_core.so 时出错?
- 为什么在定义类之前声明类的对象会在友元类中给出错误,而在友元函数中不会出错
- 安装 mply 库时出错.致命错误:gsl/gsl_sf.h:没有这样的文件或目录
- Rcpp/C++/R:比较日期时间矢量与日期时间时出错(错误:"运算符>"的不明确重载)
- 编译特征程序时出错:错误:'seq'不是'Eigen'的成员
- 可能的 GCC 链接器错误会导致将弱符号和局部符号链接在一起时出错
- 非标准语法;使用 '&' 创建指向成员的指针错误,将成员函数分配给向量时出错
- 运算符重载时出错(错误:"运算符<<不匹配(操作数类型为"std::basic_ostream<char>"和"const char [2]")
- 编译类 C++ 中的线程时出错(错误 xthread)
- 加载GLEW库时出错(错误LNK2001)
- 通过函数指针调用函数时出错(错误C2064)
- 编译core.obj时出错:错误LNK2001:未解析的外部符号_harmony_core_init
- 链接c++静态库与android ndk时出错(错误:无法识别文件格式)
- 使用GCC编译游戏时出错.(错误:将"Screen"的含义从"class Screen&q