【发布时间】:2020-11-06 18:12:10
【问题描述】:
我有一个带有 alpha(透明)层的 32 位 png 文件。我想使用 MFC 在每个像素的基础上更改 some 像素的颜色。性能不是问题(虽然更快更好)。
我编写代码调用CImage::GetPixel() 调整返回的COLORREF 和SetPixel() 新颜色,但整个图像是透明的。所以我写了下面的块,它只是获取和设置原始颜色。生成的图像是完全透明的。我还尝试简单地使用SetPixel(x, y, RGB(255, 0, 0)) 将所有像素设置为红色。有什么建议可以解决这个问题?
CImage image;
if(image.Load(sFilename) == S_OK)
{
TRACE(L"IsTransparencySupported %d", image.IsTransparencySupported()); // Returns 1.
TRACE(L"IsDIBSection %d", image.IsDIBSection()); // Returns 1.
TRACE(L"Size %dx%d", image.GetWidth(), image.GetHeight()); // Displays 141x165.
TRACE(L"BPP %d", image.GetBPP()); // Returns 32.
TRACE(L"Pitch %d", image.GetPitch()); // Returns -564.
COLORREF color;
for(int x = 0; x < image.GetWidth(); x++)
{
for(int y = 0; y < image.GetHeight(); y++)
{
color = image.GetPixel(x, y);
image.SetPixel(x, y, color);
}
}
if(image.Save(sFilenameNew, Gdiplus::ImageFormatPNG) != S_OK)
TRACE(L"Error saving %s.", sFilenameNew);
}
else
TRACE(L"Error loading png %s.", sFilename);
谢谢!
【问题讨论】:
-
COLORREF宏似乎不支持 alpha,因此 alpha 始终为零。试试SetPixel(x, y, color | 0xff000000)。如果可行,您可能需要创建自己的宏来定义具有非零 alpha 的颜色常量。如果不行,可能是SetPixel太傻了,你可能要考虑在GetBits返回的缓冲区中设置像素
标签: c++ graphics bitmap mfc cimage