⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bmpprocessor.cpp

📁 Resource editor base speadrum Chinese mobile
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	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 + -