Как & quot; обивка & quot; Изображение в переполнении стека

Я бегу за отображение изображения RGB из raw в C ++ без какой-либо библиотеки. Когда я вводю квадратное изображение (например, 512×512), моя программа может отображать изображение идеально, но оно не отображается в изображении размером not_square (например, 350×225). Я понимаю, что для этого случая мне нужно заполнение, затем я попытался найти тот же случай, но для меня не имело смысла, как люди могут дополнить свой имидж.

Если кто-нибудь может показать мне, как набивать, я буду благодарен за это. И ниже то, что я сделал для RGB из Raw.

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

}

0

Решение

Вам нужно дополнить число байтов в каждой строке кратным 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];
}
}
}
}

Я также изменил внутренний цикл для использования m_uiWidth вместо m_uiHeight,

0

Другие решения

@Retired Ninja, в любом случае, спасибо за ваш ответ … вы показали мне простой способ для этого …
Но, между прочим, я исправил и другим способом … вот оно:

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

}

0

По вопросам рекламы [email protected]