2013-10-20 64 views
0

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

如果有人能告诉我如何垫,我会感谢这一点。以下是我为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]; 
      } 
     } 
    } 

} 
+0

如果我理解你的问题是正确的,你实际上是试图以适应可变大小的图像转换成固定大小的UI。是对的吗? – 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忍者,不管怎样,谢谢您的回答...你给我这一个简单的方法... 不过顺便说一下,我有不同的方式固定矿山以及..这里是:

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

}