0

我正在运行以在没有任何库的情况下在 C++ 中显示原始的 RGB 图像。当我输入正方形图像(例如:512x512)时,我的程序可以完美地显示图像,但它不能在 not_square 大小的图像中(例如:350x225)。我知道我需要填充这种情况,然后我试图找到相同的情况,但人们如何填充他们的图像对我来说没有意义。

如果有人可以告诉我如何填充,我将非常感谢。下面是我从 Raw 中为 RGB 所做的。

void CImage_MyClass::Class_MakeRGB(void)
{

        m_BMPheader.biHeight = m_uiHeight;
        m_BMPheader.biWidth  = m_uiWidth;
        m_pcBMP = new UCHAR[m_uiHeight * m_uiWidth * 3];

    //RGB Image
    {
        int ind = 0;
        for (UINT y = 0; y < m_uiHeight; y++)
        {
            for (UINT x = 0; x < m_uiHeight*3; x+=3)
            {
                m_pcBMP[ind++] = m_pcIBuff[m_uiHeight - y -1][x+2];
                m_pcBMP[ind++] = m_pcIBuff[m_uiHeight - y -1][x+1];
                m_pcBMP[ind++] = m_pcIBuff[m_uiHeight - y -1][x];
            }
        }
    }

}
4

2 回答 2

1

您需要将每行中的字节数填充为 4 的倍数。

void CImage_MyClass::Class_MakeRGB(void)
{
    m_BMPheader.biHeight = m_uiHeight;
    m_BMPheader.biWidth = m_uiWidth;
    //Pad buffer width to next highest multiple of 4
    const int bmStride = m_uiWidth * 3 + 3 & ~3;
    m_pcBMP = new UCHAR[m_uiHeight * bmStride];
    //Clear buffer so the padding bytes are 0
    memset(m_pcBMP, 0, m_uiHeight * bmStride);

    //RGB Image
    {
        for(UINT y = 0; y < m_uiHeight; y++)
        {
            for(UINT x = 0; x < m_uiWidth * 3; x += 3)
            {
                const int bmpPos = y * bmWidth + x;
                m_pcBMP[bmpPos + 0] = m_pcIBuff[m_uiHeight - y - 1][x + 2];
                m_pcBMP[bmpPos + 1] = m_pcIBuff[m_uiHeight - y - 1][x + 1];
                m_pcBMP[bmpPos + 2] = m_pcIBuff[m_uiHeight - y - 1][x];
            }
        }
    }
}

我还将内部 for 循环更改为使用m_uiWidth而不是m_uiHeight.

于 2013-10-20T06:30:59.703 回答
0

@Retired Ninja,无论如何谢谢你的回答......你向我展示了一个简单的方法......但顺便说一句,我也用不同的方式修复了我的......这是它:

无效 CImage_MyClass::Class_MakeRGB(void) {

    m_BMPheader.biHeight = m_uiHeight;
    m_BMPheader.biWidth  = m_uiWidth;

    int padding = 0;

    int scanline = m_uiWidth * 3;

while ( ( scanline + padding ) % 4 != 0 )
{
    padding++;
}

int psw = scanline + padding;

m_pcBMP = new UCHAR[m_uiHeight * m_uiWidth * 3 + m_uiHeight * padding];

//RGB Image
    int ind = 0;
    for (UINT y = 0; y < m_uiHeight; y++)
    {
        for (UINT x = 0; x < m_uiHeight*3; x+=3)
        {
            m_pcBMP[ind++] = m_pcIBuff[m_uiHeight - y -1][x+2];
            m_pcBMP[ind++] = m_pcIBuff[m_uiHeight - y -1][x+1];
            m_pcBMP[ind++] = m_pcIBuff[m_uiHeight - y -1][x];
        }
        for(int i = 0; i < padding; i++)

        ind++;
    }

}

于 2013-10-25T09:22:05.830 回答