📄 bmpprocessor.cpp
字号:
int nImgSize = 0;//数据区大小,以字节为单位
int nOffset = 0;
CConverter convert;
BITMAPFILEHEADER *pBmfh = (BITMAPFILEHEADER *)p565Bmp;
pBmfh->bfType = convert.BigEdnToLitEdn(pBmfh->bfType);
pBmfh->bfSize = convert.ConvEdn_INT(pBmfh->bfSize);
pBmfh->bfReserved1= convert.BigEdnToLitEdn(pBmfh->bfReserved1);
pBmfh->bfReserved2 = convert.BigEdnToLitEdn(pBmfh->bfReserved2);
pBmfh->bfOffBits = convert.ConvEdn_INT(pBmfh->bfOffBits);
nOffset = pBmfh->bfOffBits;
BITMAPINFOHEADER *pBmih = (BITMAPINFOHEADER *)(pBmfh+1);
pBmih->biSize = convert.ConvEdn_INT(pBmih->biSize);
pBmih->biWidth = convert.ConvEdn_INT(pBmih->biWidth);
pBmih->biHeight = convert.ConvEdn_INT(pBmih->biHeight);
pBmih->biPlanes = convert.BigEdnToLitEdn(pBmih->biPlanes);
pBmih->biBitCount = convert.BigEdnToLitEdn(pBmih->biBitCount);
pBmih->biCompression = convert.ConvEdn_INT(pBmih->biCompression);
pBmih->biSizeImage = convert.ConvEdn_INT(pBmih->biSizeImage);
pBmih->biXPelsPerMeter = convert.ConvEdn_INT(pBmih->biXPelsPerMeter);
pBmih->biYPelsPerMeter = convert.ConvEdn_INT(pBmih->biYPelsPerMeter);
pBmih->biClrUsed = convert.ConvEdn_INT(pBmih->biClrUsed);
pBmih->biClrImportant = convert.ConvEdn_INT(pBmih->biClrImportant);
nImgSize = pBmih->biSizeImage;
if(nOffset == sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER) + 3*sizeof(DWORD))
{
//3个DWORD 颜色掩码
LPDWORD lpdwClr = (LPDWORD)(pBmih+1);
for(int i = 0; i < 3; i++)
{
*(lpdwClr+i) = convert.ConvEdn_INT(*(lpdwClr+i));
}
}
//数据区
LPWORD lpwData = (LPWORD)(p565Bmp+nOffset);
// if(!bCompressed)
convert.BigEdnToLitEdn(lpwData,nImgSize/2);
return TRUE;
}
BOOL CBmpProcessor::MovieConvertToBigEndian(LPBYTE pMovie, int nSize, BOOL bCompressed)
{
UNUSED_ALWAYS(bCompressed);
int nOffset = 0;
CConverter convert;
BITMAPFILEHEADER *pBmfh = (BITMAPFILEHEADER *)pMovie;
nOffset = pBmfh->bfOffBits;
pBmfh->bfType = convert.LitEdnToBigEdn(pBmfh->bfType);
pBmfh->bfSize = convert.ConvEdn_INT(pBmfh->bfSize);
pBmfh->bfReserved1= convert.LitEdnToBigEdn(pBmfh->bfReserved1);
pBmfh->bfReserved2 = convert.LitEdnToBigEdn(pBmfh->bfReserved2);
pBmfh->bfOffBits = convert.ConvEdn_INT(pBmfh->bfOffBits);
BITMAPINFOHEADER *pBmih = (BITMAPINFOHEADER *)(pBmfh+1);
pBmih->biSize = convert.ConvEdn_INT(pBmih->biSize);
pBmih->biWidth = convert.ConvEdn_INT(pBmih->biWidth);
pBmih->biHeight = convert.ConvEdn_INT(pBmih->biHeight);
pBmih->biPlanes = convert.LitEdnToBigEdn(pBmih->biPlanes);
pBmih->biBitCount = convert.LitEdnToBigEdn(pBmih->biBitCount);
pBmih->biCompression = convert.ConvEdn_INT(pBmih->biCompression);
pBmih->biSizeImage = convert.ConvEdn_INT(pBmih->biSizeImage);
pBmih->biXPelsPerMeter = convert.ConvEdn_INT(pBmih->biXPelsPerMeter);
pBmih->biYPelsPerMeter = convert.ConvEdn_INT(pBmih->biYPelsPerMeter);
pBmih->biClrUsed = convert.ConvEdn_INT(pBmih->biClrUsed);
pBmih->biClrImportant = convert.ConvEdn_INT(pBmih->biClrImportant);
if(nOffset==sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER) + 3*sizeof(DWORD))
{
//3个DWORD 颜色掩码
LPDWORD lpdwClr = (LPDWORD)(pBmih+1);
for(int i = 0; i < 3; i++)
{
*(lpdwClr+i) = convert.ConvEdn_INT(*(lpdwClr+i));
}
}
MOVIEINFO *pMovieInfo = (MOVIEINFO *)(pMovie+nOffset);
int nFrame = pMovieInfo->frame_num;
pMovieInfo->frame_num = convert.ConvEdn_INT(pMovieInfo->frame_num);
int nCodeSize = 0;
int nCodeOffset = 0;
int nCount = 0;
for(int i = 0;i< nFrame;i++)
{
nCodeSize = pMovieInfo->frame_infos[i].code_size;
nCodeOffset = pMovieInfo->frame_infos[i].code_offset;
pMovieInfo->frame_infos[i].code_size = convert.ConvEdn_INT(pMovieInfo->frame_infos[i].code_size );
pMovieInfo->frame_infos[i].code_offset = convert.ConvEdn_INT(pMovieInfo->frame_infos[i].code_offset );
//if(nCodeSize & 0x80000000)
{
int nCount = nCodeSize & 0x7FFFFFFF;
LPWORD pwData = (LPWORD)(pMovie + nCodeOffset);
convert.BigEdnToLitEdn(pwData,nCount/2);
}
}
return TRUE;
}
BOOL CBmpProcessor::MovieConvertToLitEndian(LPBYTE pMovie, int nSize, BOOL bCompressed)
{
UNUSED_ALWAYS(bCompressed);
int nOffset = 0;
CConverter convert;
BITMAPFILEHEADER *pBmfh = (BITMAPFILEHEADER *)pMovie;
pBmfh->bfType = convert.BigEdnToLitEdn(pBmfh->bfType);
pBmfh->bfSize = convert.ConvEdn_INT(pBmfh->bfSize);
pBmfh->bfReserved1= convert.BigEdnToLitEdn(pBmfh->bfReserved1);
pBmfh->bfReserved2 = convert.BigEdnToLitEdn(pBmfh->bfReserved2);
pBmfh->bfOffBits = convert.ConvEdn_INT(pBmfh->bfOffBits);
nOffset = pBmfh->bfOffBits;
BITMAPINFOHEADER *pBmih = (BITMAPINFOHEADER *)(pBmfh+1);
pBmih->biSize = convert.ConvEdn_INT(pBmih->biSize);
pBmih->biWidth = convert.ConvEdn_INT(pBmih->biWidth);
pBmih->biHeight = convert.ConvEdn_INT(pBmih->biHeight);
pBmih->biPlanes = convert.BigEdnToLitEdn(pBmih->biPlanes);
pBmih->biBitCount = convert.BigEdnToLitEdn(pBmih->biBitCount);
pBmih->biCompression = convert.ConvEdn_INT(pBmih->biCompression);
pBmih->biSizeImage = convert.ConvEdn_INT(pBmih->biSizeImage);
pBmih->biXPelsPerMeter = convert.ConvEdn_INT(pBmih->biXPelsPerMeter);
pBmih->biYPelsPerMeter = convert.ConvEdn_INT(pBmih->biYPelsPerMeter);
pBmih->biClrUsed = convert.ConvEdn_INT(pBmih->biClrUsed);
pBmih->biClrImportant = convert.ConvEdn_INT(pBmih->biClrImportant);
if(nOffset==sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER) + 3*sizeof(DWORD))
{
//3个DWORD 颜色掩码
LPDWORD lpdwClr = (LPDWORD)(pBmih+1);
for(int i = 0; i < 3; i++)
{
*(lpdwClr+i) = convert.ConvEdn_INT(*(lpdwClr+i));
}
}
MOVIEINFO *pMovieInfo = (MOVIEINFO *)(pMovie+nOffset);
pMovieInfo->frame_num = convert.ConvEdn_INT(pMovieInfo->frame_num);
int nFrame = pMovieInfo->frame_num;
int nCodeSize = 0;
int nCodeOffset = 0;
int nCount = 0;
for(int i = 0;i< nFrame;i++)
{
pMovieInfo->frame_infos[i].code_size = convert.ConvEdn_INT(pMovieInfo->frame_infos[i].code_size );
pMovieInfo->frame_infos[i].code_offset = convert.ConvEdn_INT(pMovieInfo->frame_infos[i].code_offset );
nCodeSize = pMovieInfo->frame_infos[i].code_size;
nCodeOffset = pMovieInfo->frame_infos[i].code_offset;
//if(nCodeSize & 0x80000000)
{
int nCount = nCodeSize & 0x7FFFFFFF;
LPWORD pwData = (LPWORD)(pMovie + nCodeOffset);
convert.BigEdnToLitEdn(pwData,nCount/2);
}
}
return TRUE;
}
BOOL CBmpProcessor::IsMovieValidate(LPCTSTR pszDirName, int *pFrameNum)
{
_ASSERTE( pszDirName != NULL );
CString strFileName;
strFileName.Format(_T("%s\\*.bmp"), pszDirName);
WIN32_FIND_DATA wfd;
HANDLE hFile = ::FindFirstFile(strFileName, &wfd);
if( hFile == INVALID_HANDLE_VALUE )
{
TRACE1("Invalid File Handle. Get Last Error reports %d\n", GetLastError());
TRACE0("The anim dir is valid!");
_tcscpy(m_szErrMsg, _T("Invalid anim dir!") );
return FALSE;
}
int nFrameNum = 1;
for( ; ::FindNextFile(hFile, &wfd); ++nFrameNum )
{
// here is null
}
::FindClose(hFile);
*pFrameNum = nFrameNum;
int nBmpBit = 0;
int nHeight = 0;
int nWidth = 0;
int nBmpSize= 0;
CStringArray arrFileName;
int i= 0;
if(nFrameNum>9)
{
for( i = 0; i< nFrameNum;i++)
{
strFileName.Format(_T("%s\\%02d.bmp"),pszDirName,i+1);
arrFileName.Add(strFileName);
}
}
else
{
for( i = 0; i< nFrameNum;i++)
{
strFileName.Format(_T("%s\\%d.bmp"),pszDirName,i+1);
arrFileName.Add(strFileName);
}
}
for(i = 0; i< nFrameNum; i++)
{
HANDLE hFile = ::CreateFile( arrFileName.GetAt(i), GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
NULL );
if( hFile == INVALID_HANDLE_VALUE )
{
_stprintf(m_szErrMsg, _T("The file '%s' not exist!"), arrFileName.GetAt(i));
return FALSE;
}
int nSize = (int)GetFileSize(hFile, NULL);
if( nSize < sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) )
{
::CloseHandle(hFile);
_stprintf(m_szErrMsg, _T("The file '%s' size is too little!"), arrFileName.GetAt(i));
return FALSE;
}
LPBYTE pBmp = (LPBYTE)malloc(nSize);
//memset( pBmp,0xff,nSize );
if( NULL == pBmp )
{
::CloseHandle(hFile);
return FALSE;
}
DWORD dwRead = 0;
if( !ReadFile(hFile, pBmp, nSize, &dwRead, NULL) || nSize != (int)dwRead )
{
TRACE1("ReadFile %s error!\r\n", arrFileName.GetAt(i));
_stprintf(m_szErrMsg, _T("ReadFile '%s' error!"), arrFileName.GetAt(i));
::CloseHandle(hFile);
return FALSE;
}
::CloseHandle(hFile);
PBITMAPFILEHEADER pbfh = (PBITMAPFILEHEADER)pBmp;
if( pbfh->bfType != 0x4d42 )
{
free(pBmp);
_stprintf(m_szErrMsg, _T("The file '%s' is incorrect bitmap file!"), arrFileName.GetAt(i));
return FALSE;
}
PBITMAPINFOHEADER pbih = (PBITMAPINFOHEADER)(pbfh + 1);
if(i == 0)
{
nBmpBit = pbih->biBitCount;
nHeight = pbih->biHeight;
nWidth = pbih->biWidth;
nBmpSize= nSize;
}
else
{
if( nBmpBit != pbih->biBitCount ||
nHeight != pbih->biHeight ||
nWidth != pbih->biWidth ||
nBmpSize != nSize )
{
free(pBmp);
_stprintf(m_szErrMsg, _T("The bmp files in aimation is not correct!"));
return FALSE;
}
}
free(pBmp);
}
return TRUE;
}
UINT CBmpProcessor::GetAnimTransColor(LPBYTE pMovie)
{
if(pMovie == NULL)
return 0;
BITMAPFILEHEADER *pFileHeader = NULL;
pFileHeader = (BITMAPFILEHEADER *)pMovie;
UINT nColor= 0;
nColor = pFileHeader->bfReserved2;
nColor = nColor<<16;
nColor |= pFileHeader->bfReserved1;
return nColor;
}
void CBmpProcessor::ForceConvertBmpFile( LPCTSTR pszFileName )
{
_ASSERTE( pszFileName != NULL );
LPBYTE pBmp = NULL;
int nSize = 0;
CBmpProcessor bmpProc;
if( bmpProc.LoadBmpFile(pszFileName, &pBmp, &nSize, TRUE) )
{
HANDLE hFile = ::CreateFile( pszFileName, GENERIC_WRITE, 0,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,
NULL );
_ASSERTE( hFile != INVALID_HANDLE_VALUE );
DWORD dwWritten = 0;
WriteFile(hFile, pBmp, nSize, &dwWritten, NULL);
CloseHandle(hFile);
bmpProc.FreeBmpStream( pBmp );
}
}
BOOL CBmpProcessor::DeleteDirectory(LPCTSTR lpszDirName)// DeleteDirectory(_T("c:\\aaa"))
{
CFileFind tempFind;
_TCHAR tempFileFind[MAX_PATH] = {0};
_stprintf(tempFileFind,_T("%s\\*.*"),lpszDirName);
BOOL IsFinded=(BOOL)tempFind.FindFile(tempFileFind);
while(IsFinded)
{
IsFinded=(BOOL)tempFind.FindNextFile();
if(!tempFind.IsDots())
{
_TCHAR foundFileName[MAX_PATH] = {0};
_tcscpy(foundFileName,tempFind.GetFileName().GetBuffer(MAX_PATH));
if(tempFind.IsDirectory())
{
_TCHAR tempDir[MAX_PATH] = {0};
_stprintf(tempDir,_T("%s\\%s"),lpszDirName,foundFileName);
DeleteDirectory(tempDir);
}
else
{
_TCHAR tempFileName[MAX_PATH] = {0};
_stprintf(tempFileName,_T("%s\\%s"),lpszDirName,foundFileName);
DeleteFile(tempFileName);
}
}
}
tempFind.Close();
if(!RemoveDirectory(lpszDirName))
{
AfxMessageBox(IDS_ERR_DELETE_DIR_FAIL);
return FALSE;
}
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -