C++ 代码导致图像偏蓝且有竖线的原因分析及修正方法
C++ 代码导致图像偏蓝且有竖线的原因分析及修正方法
以下代码片段展示了将位图数据写入 LCD 的常见方法,然而生成的图像却呈现偏蓝且带有竖线的现象:
int xr = 0;
int yr = 0;
int j;
int i;
for (j = y; j < (y + m_MFheight); j++)
{
xr = 0; // 初始化xr为0
i = 0;
for (i = x; i < (x + m_MFwidth); i++)
{
Lcd::getInstance()->lcdAddr()[j * 800 + i] = m_bm->map[yr * m_MFwidth + xr];
xr++;
}
yr++;
}
根据代码,生成的图像偏蓝且有竖线的原因可能是以下两个问题:
-
图像偏蓝:可能是因为在将位图数据写入到 LCD 地址时,只写入了位图的蓝色通道数据,而没有考虑位图的红色和绿色通道数据。可以尝试在写入 LCD 地址时,同时写入位图的红色和绿色通道数据。
-
存在竖线:可能是因为在每行结束后没有重新将 xr 重置为 0。在内层的 for 循环结束后,应该将 xr 重新赋值为 0,以便在下一行开始时从第一个像素开始写入。
修正后的代码如下所示:
int xr = 0;
int yr = 0;
int j;
int i;
for (j = y; j < (y + m_MFheight); j++)
{
xr = 0; // 初始化xr为0
for (i = x; i < (x + m_MFwidth); i++)
{
int pixelIndex = j * 800 + i;
Lcd::getInstance()->lcdAddr()[pixelIndex] = m_bm->map[yr * m_MFwidth + xr]; // 写入位图的蓝色通道数据
Lcd::getInstance()->lcdAddr()[pixelIndex + 1] = m_bm->map[yr * m_MFwidth + xr + 1]; // 写入位图的绿色通道数据
Lcd::getInstance()->lcdAddr()[pixelIndex + 2] = m_bm->map[yr * m_MFwidth + xr + 2]; // 写入位图的红色通道数据
xr += 3;
}
yr++;
}
请注意,上述修正的代码假设每个像素的颜色通道数据是按照 BGR 的顺序排列的,如果实际的位图数据顺序不同,请根据实际情况进行修改。
原文地址: https://www.cveoy.top/t/topic/o9Rw 著作权归作者所有。请勿转载和采集!