[Help] Create HeightMap program

Results 1 to 3 of 3
  1. #1
    Account Upgraded | Title Enabled! ADMTec is offline
    MemberRank
    Aug 2011 Join Date
    469Posts

    [Help] Create HeightMap program

    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);
    	}
    }


  2. #2
    Account Upgraded | Title Enabled! or30n is offline
    MemberRank
    Jun 2005 Join Date
    726Posts
    I can give it a try cause I’m looking for a tool like that one to use mu online maps in unity.

  3. #3
    Account Upgraded | Title Enabled! ADMTec is offline
    MemberRank
    Aug 2011 Join Date
    469Posts
    Quote Originally Posted by or30n View Post
    I can give it a try cause I’m looking for a tool like that one to use mu online maps in unity.
    It would be great if you could try it, I also want to use it in a project!



Advertisement