Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ BitBlt从剪贴板复制位图提供错误的颜色_C++_Winapi_Palette_Bitblt - Fatal编程技术网

C++ BitBlt从剪贴板复制位图提供错误的颜色

C++ BitBlt从剪贴板复制位图提供错误的颜色,c++,winapi,palette,bitblt,C++,Winapi,Palette,Bitblt,我正在将剪贴板中的图像粘贴到我的程序中。位图放在背景memDC位图上,然后在绘制到屏幕之前与另一个memDC合成。背景位图为每像素8位。问题是bitblt将黑色(0x00000000)变为几乎黑色(0x0000101)。如果我把同样的东西粘贴到MSPaint中,我会变黑。如果我从MSPaint复制黑色,我几乎会变黑。(其他颜色也有破损)。如果我将背景位图更改为32bpp,我会得到正确的颜色,但这目前不是一个选项 以下是一些演示此问题的代码: /* *HWND hWnd; // main win

我正在将剪贴板中的图像粘贴到我的程序中。位图放在背景memDC位图上,然后在绘制到屏幕之前与另一个memDC合成。背景位图为每像素8位。问题是bitblt将黑色(0x00000000)变为几乎黑色(0x0000101)。如果我把同样的东西粘贴到MSPaint中,我会变黑。如果我从MSPaint复制黑色,我几乎会变黑。(其他颜色也有破损)。如果我将背景位图更改为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位图?他们甚至没有尽可能地使用DIB,我可以从查看基于

的可用内容看出,每像素8位位图需要一个关联的调色板来指定颜色,这是独立的-您可以使用剪贴板获得它。一旦你有了它,你就可以在选定位图的DC上使用它。

每像素8位的位图需要一个相关的调色板来指定颜色,这是独立的-你可以使用从剪贴板上获得它。一旦你有了它,你就可以使用它,并且在选择位图的DC上。

如果你从32bpp复制到8bpp,你会丢失一些颜色。这是没有办法的。除非源图像中的颜色数量有限。然后可以在目标图像中使用索引调色板。源位图为全黑色。黑色在调色板中,但BitBlt将其映射为几乎黑色。GetNearestColor()返回黑色。背景图像调色板索引0处的颜色是什么?黑色。我尝试了GetNearestPaletteIndex()函数,它返回了索引0,它是黑色的。如果从32bpp复制到8bpp,将丢失一些颜色。这是没有办法的。除非源图像中的颜色数量有限。然后可以在目标图像中使用索引调色板。源位图为全黑色。黑色在调色板中,但BitBlt将其映射为几乎黑色。GetNearestColor()返回黑色。背景图像调色板索引0处的颜色是什么?黑色。我尝试了GetNearestPaletteIndex()函数,它返回了索引0,它是黑色的返回NULL。也许是因为剪贴板上的位图是32位的?查看可用的格式,屏幕截图和绘制都会将位图放在剪贴板上,因为没有可用的调色板。@MrPhilTX,对不起,我想我看错了问题。我以为剪贴板图像是8位的。不用担心,谢谢你的尝试!你帮我想出了一些其他的方法。@Mark Ransom:传入CreateCompatibleBitmap的memDC包含声称为8bpp的背景位图,因此粘贴位图也将是8bpp。@ChrisBecke这就是它需要调色板的原因。
HPALETTE hPal=(HPALETTE)GetClipboardData(CF_调色板)返回NULL。也许是因为剪贴板上的位图是32位的?查看可用的格式,屏幕截图和绘制都会将位图放在剪贴板上,因为没有可用的调色板。@MrPhilTX,对不起,我想我看错了问题。我以为剪贴板图像是8位的。不用担心,谢谢你的尝试!你帮我想出了一些其他的方法。@Mark Ransom:传入CreateCompatibleBitmap的memDC包含声称为8bpp的背景位图,因此pasteBitmap也将是8bpp。@chrisbeck这就是它需要调色板的原因。