编一程序把Raw格式的图像转成BMP格式显示,加上BMP头以后,只显示了图像上部的1/3,而且是显示在绘图窗口的底部,下面是程序,请高手指教!谢谢!//Raw转成BMP的程序
BOOL WINAPI Raw2DIB ( LPCTSTR lpszPathName )
{
     BITMAPFILEHEADER fileheader ;
     LPBITMAPINFOHEADER lpbmpheader ;
 lpbmpheader = new BITMAPINFOHEADER[sizeof(BITMAPINFOHEADER)];
 CFile fileDIB,file;
 CFileException fe;
     int col,row,nRawCount,i,j;
 
 col = 1600;
 row = 1600; unsigned char *szBuffer,*pData;
szBuffer = new unsigned char[col*row*3];
 
if (!file.Open(lpszPathName, CFile::modeRead | CFile::shareDenyWrite, &fe))
{
return FALSE;
}
     
 LPCTSTR lpszDIBFileName = _T("C:\\_temp.bmp");
 if ( !fileDIB.Open ( lpszDIBFileName, CFile::modeWrite | CFile::modeCreate ) )
     return FALSE ;     //定义BMP信息头,用来描述位图的颜色、压缩方法等
 lpbmpheader ->biBitCount = 24;
 lpbmpheader ->biClrImportant = 0;
 lpbmpheader ->biClrUsed=0;
 lpbmpheader ->biCompression=BI_RGB;
 lpbmpheader ->biHeight=row;
          lpbmpheader ->biWidth=col;
 lpbmpheader ->biPlanes=1;
 lpbmpheader ->biSize=sizeof(BITMAPINFOHEADER);
 lpbmpheader ->biXPelsPerMeter=0;
 lpbmpheader ->biYPelsPerMeter=0;
 lpbmpheader ->biSizeImage=0;
 pData= new unsigned char[col*row*3];////根据Raw图象的信息定义缓冲区
 nRawCount = file.Read( szBuffer, col*row*3 );//读Raw文件  for ( i = 0; i < row; i = i+3 )//行不加4
for ( j = 0; j < col; j++ )
{
pData[(row-i-1)*col + j*3 +2] = szBuffer[i*col + j]; //r
}

 for ( i = 1; i < row; i = i+3)
for ( j = 0; j < col; j++)
{
pData[(row-i)*col + j*3 + 1] = szBuffer[i*col + j];  //g
}  for ( i = 2; i < row; i = i+3)
for (j = 0; j < col; j++ )
{
pData[(row-i+1)*col + j*3 ] = szBuffer[i*col + j];  //b
}     int ncolors = 1 << lpbmpheader -> biBitCount ;     //定义BMP文件头,包含有关于文件类型、文件大小、存放位置等信息 
     fileheader.bfType = ( ( WORD ) ( 'M' << 8 ) | 'B' ) ;
     fileheader.bfSize = col*row*3 + sizeof ( fileheader ) + lpbmpheader ->biSize ;
     fileheader.bfReserved1 = 0 ;
     fileheader.bfReserved2 = 0 ;
     fileheader.bfOffBits = ( DWORD ) ( sizeof ( fileheader ) + lpbmpheader -> biSize );
 
     // Write the file header 
     fileDIB.Write ( &fileheader, sizeof ( fileheader ) ) ;
     // Write the DIB header 
     fileDIB.Write ( lpbmpheader, sizeof ( *lpbmpheader) );
     // Write the DIB Data bits
     fileDIB.Write ( pData, col*row*3 ) ;
    
     fileDIB.Close();
     delete szBuffer;
     delete pData;     return TRUE ;
}//文档里读BMP的程序
HDIB WINAPI ReadDIBFile(CFile& file)
{
BITMAPFILEHEADER bmfHeader;
UINT nBitsSize;
HDIB hDIB;
LPSTR pDIB; /*
 * get length of DIB in bytes for use when reading
 */ nBitsSize = (UINT)file.GetLength(); /*
 * Go read the DIB file header and check if it's valid.
 */
if (file.Read((LPSTR)&bmfHeader, sizeof(bmfHeader)) != sizeof(bmfHeader))
return NULL; if (bmfHeader.bfType != DIB_HEADER_MARKER)
return NULL; /*
 * Allocate memory for DIB
 */
hDIB = (HDIB) ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, (DWORD)nBitsSize);
if (hDIB == 0)
{
return NULL;
}
pDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB); /*
 * Go read the bits.
 */
if (file.Read(pDIB, nBitsSize - sizeof(BITMAPFILEHEADER)) !=
nBitsSize - sizeof(BITMAPFILEHEADER) )
{
::GlobalUnlock((HGLOBAL) hDIB);
::GlobalFree((HGLOBAL) hDIB);
return NULL;
}
::GlobalUnlock((HGLOBAL) hDIB);
return hDIB;
}//视图里绘制BMP的程序
BOOL WINAPI PaintDIB(HDC     hDC,
LPRECT  lpDCRect,
HDIB    hDIB,
LPRECT  lpDIBRect,
CPalette* pPal)
{
LPSTR    lpDIBHdr;            // Pointer to BITMAPINFOHEADER
LPSTR    lpDIBBits;           // Pointer to DIB bits
BOOL     bSuccess=FALSE;      // Success/fail flag
HPALETTE hPal=NULL;           // Our DIB's palette
HPALETTE hOldPal=NULL;        // Previous palette /* Check for valid DIB handle */
if (hDIB == NULL)
return FALSE; /* Lock down the DIB, and get a pointer to the beginning of the bit
 *  buffer
 */
lpDIBHdr  = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);
lpDIBBits = ::FindDIBBits(lpDIBHdr); // Get the DIB's palette, then select it into DC
if (pPal != NULL)
{
hPal = (HPALETTE) pPal->m_hObject; // Select as background since we have
// already realized in forground if needed
hOldPal = ::SelectPalette(hDC, hPal, TRUE);
} /* Make sure to use the stretching mode best for color pictures */
::SetStretchBltMode(hDC, COLORONCOLOR); /* Determine whether to call StretchDIBits() or SetDIBitsToDevice() */
if ((RECTWIDTH(lpDCRect)  == RECTWIDTH(lpDIBRect)) &&
   (RECTHEIGHT(lpDCRect) == RECTHEIGHT(lpDIBRect)))
bSuccess = ::SetDIBitsToDevice(hDC,                    // hDC
   lpDCRect->left,             // DestX
   lpDCRect->top,              // DestY
   RECTWIDTH(lpDCRect),        // nDestWidth
   RECTHEIGHT(lpDCRect),       // nDestHeight
   lpDIBRect->left,            // SrcX
   (int)DIBHeight(lpDIBHdr) -
  lpDIBRect->top -
  RECTHEIGHT(lpDIBRect),   // SrcY
   0,                          // nStartScan
   (WORD)DIBHeight(lpDIBHdr),  // nNumScans
   lpDIBBits,                  // lpBits
   (LPBITMAPINFO)lpDIBHdr,     // lpBitsInfo
   DIB_RGB_COLORS);            // wUsage
   else
  bSuccess = ::StretchDIBits(hDC,                          // hDC
   lpDCRect->left,                 // DestX
   lpDCRect->top,                  // DestY
   RECTWIDTH(lpDCRect),            // nDestWidth
   RECTHEIGHT(lpDCRect),           // nDestHeight
   lpDIBRect->left,                // SrcX
   lpDIBRect->top,                 // SrcY
   RECTWIDTH(lpDIBRect),           // wSrcWidth
   RECTHEIGHT(lpDIBRect),          // wSrcHeight
   lpDIBBits,                      // lpBits
   (LPBITMAPINFO)lpDIBHdr,         // lpBitsInfo
   DIB_RGB_COLORS,                 // wUsage
   SRCCOPY);                       // dwROP   ::GlobalUnlock((HGLOBAL) hDIB); /* Reselect old palette */
if (hOldPal != NULL)
{
::SelectPalette(hDC, hOldPal, TRUE);
}   return bSuccess;
}

解决方案 »

  1.   

    问题已解决,但我觉得raw转bmp的方法我的太笨,请教哪位有好的方法,烦发邮件至[email protected],谢谢!下面是修改后的程序,只改了循环这一点。
    for ( i = 0; i < row; i = i++ )
        for ( j = 0; j < col; j++ )
             {
                pData[(row-i-1)*col*3 + j*3 +2] = szBuffer[3*i*col + j];  //r
             }
    for ( i = 1; i < row; i = i++)
        for ( j = 0; j < col; j++)
             {
                pData[(row-i)*col*3 + j*3 + 1] = szBuffer[(3*i-2)*col + j];  //g
             }
     for ( i = 2; i < row; i = i++ )
        for (j = 0; j < col; j++ )
             {
                pData[(row-i+1)*col*3 + j*3 ] = szBuffer[(3*i-4)*col + j];  //b
             }