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++;
}

根据代码,生成的图像偏蓝且有竖线的原因可能是以下两个问题:

  1. 图像偏蓝:可能是因为在将位图数据写入到 LCD 地址时,只写入了位图的蓝色通道数据,而没有考虑位图的红色和绿色通道数据。可以尝试在写入 LCD 地址时,同时写入位图的红色和绿色通道数据。

  2. 存在竖线:可能是因为在每行结束后没有重新将 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 的顺序排列的,如果实际的位图数据顺序不同,请根据实际情况进行修改。

C++ 代码导致图像偏蓝且有竖线的原因分析及修正方法

原文地址: https://www.cveoy.top/t/topic/o9Rw 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录