C++ 如何从位图图像到窗口仅绘制黑色(过滤除黑色以外的颜色)
我正在尝试制作一个绘图程序,使用户可以更改背景,而前景颜色(用于绘制形状)始终为黑色。 现在,当用户更改背景颜色时,HBRUSH会使用选定的颜色绘制整个窗口,从而清除绘制的所有形状。 为了解决这个问题,我做了3个步骤(注意问题出在第三步):C++ 如何从位图图像到窗口仅绘制黑色(过滤除黑色以外的颜色),c++,visual-c++,mfc,gdi+,gdi,C++,Visual C++,Mfc,Gdi+,Gdi,我正在尝试制作一个绘图程序,使用户可以更改背景,而前景颜色(用于绘制形状)始终为黑色。 现在,当用户更改背景颜色时,HBRUSH会使用选定的颜色绘制整个窗口,从而清除绘制的所有形状。 为了解决这个问题,我做了3个步骤(注意问题出在第三步): saveBeforeBackcolorChange():在更改背景色之前将窗口保存为位图的函数 FillRect(hdc、rect、color):使用新颜色绘制整个窗口 RealSuffCudioCudioCudio():应该只从位图(代表图)中考虑黑色像
void loadAfterBackcolorChanged(HDC hdc){
ULONG_PTR m_gdiplusToken;
GdiplusStartupInput gdiplusStartupInput;
GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);
Graphics graphics(hdc);
wchar_t* filePathString = new wchar_t[MAX_PATH];
MultiByteToWideChar(CP_ACP, 0, TEMP_FILE.c_str(), -1, filePathString, 4096);
Image image(filePathString);
Gdiplus::ImageAttributes imAtt;
imAtt.SetColorKey(
Color(1, 1, 1),
Color(255, 255, 255),
ColorAdjustTypeBitmap);
graphics.DrawImage(
&image,
Rect(0, 0, image.GetWidth(), image.GetHeight()), // dest rect
0, 0, image.GetWidth(), image.GetHeight(), // source rect
UnitPixel,
&imAtt);
}
不幸的是,结果是它认为只有白色是透明的。这意味着,如果背景是白色(这是初始背景色),它工作得很好。因此,用户只能成功更改背景色一次
如果有人能帮忙,我将不胜感激。是的,这正是这种方法的问题所在。你要么需要图层信息(即始终将前景与背景分开存储),要么需要知道如何根据现有像素颜色选择性填充的填充算法。在我看来,你似乎错误地使用了
SetColorkey
功能;那些硬编码的低颜色键和高颜色键的值对我来说味道不好。那么,你认为我如何才能实现我的目标呢?