c++ - 使用(MFC 的)CImage::SetPixel() 改变像素的颜色
问题描述
我有一个带有 alpha(透明)层的 32 位 png 文件。我想使用 MFC 在每个像素的基础上更改某些像素的颜色。性能不是问题(尽管更快更好)。
我编写了代码来调用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);
谢谢!
解决方案
CImage image;
for (int i=0;i<image.ImgHeight;i++)
{
for (int j=0;j<image.ImgWidth;j++)
{
int index = i*image.ImgWidth+j;
unsigned char* pucColor = reinterpret_cast<unsigned char *> (image.GetPixelAddress(j , i));
pucColor[0] = bValues[index];
pucColor[1] = gValues[index];
pucColor[2] = rValues[index];
}
}
推荐阅读
- python - 如何在不退出主循环的情况下停止倒计时并重置起始值?
- sql - BigQuery - 比较源表和目标表并仅插入新记录
- node.js - Aws ec2 - 如何设置负载均衡器以匹配 ec2 实例上的 docker 容器
- r - 代码可以是进度,但当我在 r 中转换 html 时显示有错误
- javascript - 将 js 目录和节点模块编译成单个 js 文件
- python - 有没有办法使用 Ibis (impala) 遍历表行
- scala - Snowflake 和 Databricks:有没有办法在 Utils.runQuery 中使用 Transaction?
- elasticsearch - 有没有办法从弹性搜索亮点中排除特定术语?
- haxe - 如何在 php 目标上成功解析带有 haxe 的 utf-16le 编码的 jsonfile?
- reactjs - 如何使用 React Query 访问缓存以显示数据?