gpt4 book ai didi

c++ - BitBlt 从剪贴板复制位图给出了错误的颜色

转载 作者:行者123 更新时间:2023-11-28 00:53:11 25 4
gpt4 key购买 nike

我正在将剪贴板中的图像粘贴到我的程序中。位图被放置在背景 memDC 位图上,然后在绘制到屏幕之前与另一个 memDC 合成。背景位图是每像素 8 位。问题是 bitblt 将 Black(0x00000000) 变成了 Almost-Black (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 的要点,是我可以查询像素颜色,然后询问上下文它将使用什么颜色,它返回正确的颜色( Black),而不是 BitBlt 生成的 Almost Black。

其他程序似乎没有将调色板放在剪贴板上 - 也许是因为它们正在放置不需要调色板的 32bpp 位图?根据 MSDN's clipboard translation table 查看可用的内容,他们甚至没有尽我所能判断 DIB。

最佳答案

每像素 8 位位图需要一个关联的调色板来指定颜色,这是单独的 - 您可以使用 CF_PALETTE 从剪贴板中获取它.一旦你有了它,你就可以使用 SelectPaletteRealizePalette在位图被选入的 DC 上。

关于c++ - BitBlt 从剪贴板复制位图给出了错误的颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12918303/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com