2013-10-20 1 views
0

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

Если кто-нибудь может показать мне, как использовать пэд, я был бы благодарен за это. И ниже - это то, что я сделал для 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

Если я правильно понять ваш вопрос, вы на самом деле пытаетесь вставить изображение размера переменного в пользовательский интерфейс фиксированного размера. Это правильно? – Papouh

ответ

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

Не могли бы вы увидеть мою программу, пожалуйста ?, Мне нужны те же советы и предложения. Я пришлю вам по электронной почте и спрошу что-нибудь для вас. Могу я..? Спасибо – Alearner

0

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

недействительного CImage_MyClass :: Class_MakeRGB (недействительные) {

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

}