Welcome!

Join our community of MMO enthusiasts and game developers! By registering, you'll gain access to discussions on the latest developments in MMO server files and collaborate with like-minded individuals. Join us today and unlock the potential of MMO server development!

Join Today!

[Help] Create HeightMap program

Joined
Aug 29, 2011
Messages
512
Reaction score
33
I found this code to convert an 8bit, 24bit heightmap to 32bit ! however I'm not good at programming and I wanted to know if someone could help me, I want to use it to modify the heightmap of MuOnline maps to put it on another platform!




Code:
3 - Buttons and 1 text box.
1. Browse button for browse the target bmp.
2. Convert button for convert to 32 bit bmp
3. Exit button
4. Text box to show brows path.

Code

the following members and functions should add in .h file
CString m_strPath;
CString m_strNewPath;

HANDLE m_hFile2, m_hFile;
BITMAPFILEHEADER   m_bmfHeader, m_bmfHeader2;
    BITMAPINFOHEADER   m_bi, m_bi2;
int m_nSizeImage;
char* lpbitmap2;
DWORD dwBytesWritten2;
CString m_strEdit1;
CString m_strLabel;
void Convert8bit();
void Convert24bit();


in Cpp File Following functions are added.
void BitmapConverterDlg::onButtonBrowse()
   CFileDialog dlg(1);
   if(dlg.DoModal()==IDOK)
   {
       m_strLabel="";
       m_strPath=dlg.GetPathName();
       m_strEdit1=m_strPath;
       UpdateData(0);
       m_strPath.Replace("\\","\\\\");

   }



Expand ▼   
void BitmapConverterDlg::OnButtonConvert()
{
    m_strNewPath=m_strPath;
    m_strNewPath.TrimRight(".bmp");
    m_strNewPath+="_New.bmp";
    m_hFile2=CreateFile(m_strPath,
                    GENERIC_READ,
                    0,
                    NULL,OPEN_EXISTING,
                    FILE_ATTRIBUTE_NORMAL, NULL);
    if(m_hFile2==INVALID_HANDLE_VALUE)
    {
        AfxMessageBox("Cannot Open a New File");
        return;
    }
    dwBytesWritten2 = 0;
    ReadFile(m_hFile2, (LPSTR)&m_bmfHeader2, sizeof(BITMAPFILEHEADER), &dwBytesWritten2, NULL);
    ReadFile(m_hFile2, (LPSTR)&m_bi2, sizeof(BITMAPINFOHEADER), &dwBytesWritten2, NULL);

    if(0x18==m_bi2.biBitCount)  //Checking bits/pixel is 24
    {
        AfxMessageBox("This is 24bit BmP");
        Convert24bit();
    }
    else if(0x08==m_bi2.biBitCount)     //Checking bits/pixel is 8
    {
        AfxMessageBox("This is 8 bit bmp");
        Convert8bit();
    }
    else
    {
        AfxMessageBox("This is Not 8 bit or 24 bit bmp");
    }
    CloseHandle( m_hFile2 );
    m_strNewPath = "";

}



the Following Functions do the convertion of bitmap from 8 bit to 32 bit
Expand ▼   
void BitmapConverterDlg::Convert8bit()
{
	m_nSizeImage=m_bi2.biSizeImage;
	char* table=new char[1024];
	ReadFile(m_hFile2, (LPSTR)table, 1024, &dwBytesWritten2, NULL);	
	lpbitmap2=new char[m_nSizeImage];
	ReadFile(m_hFile2, (LPSTR)lpbitmap2, m_nSizeImage, &dwBytesWritten2, NULL);
	
	int width=m_bi2.biWidth;
	int height=m_bi2.biHeight;
	int size=height*width*4;
	HANDLE hFile = CreateFile(m_strNewPath,
					        GENERIC_WRITE,
							0,
							NULL,
							CREATE_ALWAYS,
							FILE_ATTRIBUTE_NORMAL, NULL);  
	if(hFile==INVALID_HANDLE_VALUE)
	{
		AfxMessageBox("Cannot Open File");
	}
	char* lpbitmap=new char[size];
	int padding=0;
	if(width%4)
	padding=4-(width%4);
	int shif=0;
	int index;
	int m_nNewIndex=0;
	for(int i=0;i<m_nSizeImage;i++)
	{
			index=(int)lpbitmap2[i];
			index=4*index;
			lpbitmap[m_nNewIndex]=table[index];
			lpbitmap[m_nNewIndex+1]=table[index+1];
			lpbitmap[m_nNewIndex+2]=table[index+2];
			lpbitmap[m_nNewIndex+3]=table[index+3];
			m_nNewIndex+=4;
			shif++;
			if(shif==width)
			{
				i+=padding;
				shif=0;
			}		
	}
	
	m_bmfHeader=m_bmfHeader2;
	m_bi=m_bi2;
	m_bmfHeader.bfOffBits=0x00000036;	//Changing the offset value.
	m_bmfHeader.bfSize=52+size;			//Changing the Size
	m_bi.biBitCount=0x20;				//Changing bits/pixel to 32
	m_bi.biSizeImage=size;				//Changing the image Size
    DWORD dwBytesWritten = 0;
    WriteFile(hFile, (LPSTR)&m_bmfHeader, sizeof(BITMAPFILEHEADER), &dwBytesWritten, NULL);
    WriteFile(hFile, (LPSTR)&m_bi, sizeof(BITMAPINFOHEADER), &dwBytesWritten, NULL);
    WriteFile(hFile, (LPSTR)lpbitmap, size, &dwBytesWritten, NULL);
	
	//	AfxMessageBox("File Converted\n New File : "+m_strNewPath);
	if(dwBytesWritten)
	{
		m_strLabel="File Converted"+m_strNewPath;
		m_strEdit1="";
		UpdateData(0);
		CloseHandle(hFile);
	}
}


the Following Functions do the convertion of bitmap from 24 bit to 32 bit
Expand ▼   
void BitmapConverterDlg::Convert24bit()
{
	m_nSizeImage=m_bi2.biSizeImage;
	lpbitmap2=new char[m_nSizeImage];	
	ReadFile(m_hFile2, (LPSTR)lpbitmap2, m_nSizeImage, &dwBytesWritten2, NULL);
	int width=m_bi2.biWidth;
	int height=m_bi2.biHeight;
	int size=height*width*4;
		
	HANDLE hFile = CreateFile(m_strNewPath,
						        GENERIC_WRITE,
								0,
								NULL,
								CREATE_ALWAYS,
				FILE_ATTRIBUTE_NORMAL, NULL);  
	if(hFile==INVALID_HANDLE_VALUE)
	{
		AfxMessageBox("Cannot Open File");
	}
	char* lpbitmap=new char[size];
	int padding=0;		
	padding=width%4;
	int d=width*3;
	int m_nNewIndex=0;
	for(int i=0;i<m_nSizeImage;i++)
	{
		
			lpbitmap[m_nNewIndex]=lpbitmap2[i];
	
			if((0!=padding)&&(0==(i+1)%d))
			{
				i=i+padding;
				d=width*3+d+padding;
			}
			m_nNewIndex++;
			if(0==(m_nNewIndex+1)%4)
			{	lpbitmap[m_nNewIndex]=0x00;
				m_nNewIndex++;
			}
	}
	
	m_bmfHeader=m_bmfHeader2;
	m_bi=m_bi2;
	m_bmfHeader.bfOffBits=0x00000036;		//Changing the offset value.
	m_bmfHeader.bfSize=52+size;				//Changing the Size
	m_bi.biBitCount=0x20;					//Changing bits/pixel to 32
	m_bi.biSizeImage=size;					//Changing the image Size
    DWORD dwBytesWritten = 0;
    WriteFile(hFile, (LPSTR)&m_bmfHeader, sizeof(BITMAPFILEHEADER), &dwBytesWritten, NULL);
    WriteFile(hFile, (LPSTR)&m_bi, sizeof(BITMAPINFOHEADER), &dwBytesWritten, NULL);
    WriteFile(hFile, (LPSTR)lpbitmap, size, &dwBytesWritten, NULL);
	//	AfxMessageBox("File Converted\n New File : "+m_strNewPath);
	if(dwBytesWritten)
	{
		m_strLabel="File Converted"+m_strNewPath;
		m_strEdit1="";
		UpdateData(0);
		CloseHandle(hFile);
	}
}
 
Back
Top