编一程序把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;
}
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;
}
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
}