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

📄 rawtobmp.cpp

📁 这是一个用ppt做的软件工程实习有关的资料
💻 CPP
字号:
// RawToBmp.cpp : implementation file
//

#include "stdafx.h"
#include "shiqian0197.h"
#include "RawToBmp.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CRawToBmp dialog


CRawToBmp::CRawToBmp(CWnd* pParent /*=NULL*/)
	: CDialog(CRawToBmp::IDD, pParent)
{
	//{{AFX_DATA_INIT(CRawToBmp)
	m_sBmpOut = _T("");
	m_sRawIn = _T("");
	m_iHeight = 0;
	m_iWidth = 0;
	//}}AFX_DATA_INIT
}


void CRawToBmp::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CRawToBmp)
	DDX_Text(pDX, IDC_EDIT_BMP_OUT, m_sBmpOut);
	DDX_Text(pDX, IDC_EDIT_RAW_IN, m_sRawIn);
	DDX_Text(pDX, IDC_EDIT_HEIGHT, m_iHeight);
	DDX_Text(pDX, IDC_EDIT_WIDTH, m_iWidth);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CRawToBmp, CDialog)
	//{{AFX_MSG_MAP(CRawToBmp)
	ON_BN_CLICKED(IDC_BUTTON_RAW, OnButtonRaw)
	ON_BN_CLICKED(IDC_BUTTON_BMP, OnButtonBmp)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CRawToBmp message handlers

void CRawToBmp::OnButtonRaw() 
{

	static char BASED_CODE file[]="RAW Files(*.RAW)|*.raw|所有文件(*.*)|*.*||";
	//对话框初始化
	CFileDialog SelectFile(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,file,NULL);
	//弹出对话框
	SelectFile.DoModal();
	//得到文件路径
	CString  FileName;
	FileName=SelectFile.GetPathName();
	//成员变量赋值
	m_sRawIn=FileName;
	//数据刷新
	UpdateData(FALSE);	
}

void CRawToBmp::OnButtonBmp() 
{
	// TODO: Add your control notification handler code here
		static char BASED_CODE file[]="BMP Files(*.BMP)|*.bmp|所有文件(*.*)|*.*||";
	//对话框初始化
	CFileDialog SelectFile(FALSE,"bmp",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,file,NULL);
	//弹出对话框
	SelectFile.DoModal();
	//得到文件路径
	CString  FileName;
	FileName=SelectFile.GetPathName();
	//成员变量赋值
	m_sBmpOut=FileName;
	//数据刷新
	UpdateData(FALSE);
}

void CRawToBmp::OnOK() 
{
// TODO: Add extra validation here
	//数据刷新
    UpdateData(TRUE);
	//声明DIB句柄HDIB
	DECLARE_HANDLE(HDIB);
	HDIB hDIB;  //定义HDIB句柄变量,用来存放BMP位图
	LPSTR pDIB;  //定义字符指针变量,用来存放位图数据
	//打开文件
	CFile fileraw,filebmp;  //CFile 读写文件
	//以读和拒绝写的方式打开所选文件名为m_sRawIn的格式文件
    fileraw.Open(m_sRawIn,CFile::modeRead|CFile::shareDenyWrite,NULL);
	//得到文件的大小
	DWORD  filesize=fileraw.GetLength();
	//根据raw格式文件大小来申请分配内存空间
	hDIB=(HDIB)::GlobalAlloc(GMEM_MOVEABLE|GMEM_ZEROINIT,filesize);
    //若分配不成功,即hDIB==0,则程序返回
	if(hDIB==0)
	{
		return;
	}
	//若分配成功,得到句柄内存的起始地址
	pDIB=(LPSTR)::GlobalLock((HGLOBAL)hDIB);
	//将Raw文件读到pDIB所指向的内存块


	fileraw.ReadHuge(pDIB,filesize);
    //不允许其它程序同时打开所选的BMP文件
	filebmp.Open(m_sBmpOut,CFile:: modeCreate|CFile::modeWrite|CFile::shareExclusive,NULL);
    //写文件:文件头,位图信息头,调色板,位图数据
	//根据BMP文件由四部分组成,下面分别给各部分赋值并写入BMP文件
	BITMAPFILEHEADER bmfHdr;//位图文件头
	BITMAPINFOHEADER bmpHdr;//位图信息头
	RGBQUAD rgb[256];//调色板
    //位图文件头部分信息初始化
	bmfHdr.bfType='MB';
	bmfHdr.bfReserved1=0;
	bmfHdr.bfReserved2=0;
    //位图信息头部分信息初始化
	bmpHdr.biSize=40;
    bmpHdr.biWidth=m_iWidth;
    bmpHdr.biHeight=m_iHeight;
    bmpHdr.biPlanes=1;
	bmpHdr.biCompression=BI_RGB;
	bmpHdr.biXPelsPerMeter=0;
	bmpHdr.biYPelsPerMeter=0;
	bmpHdr.biClrUsed=0;
	bmpHdr.biClrImportant=0;

	bmpHdr.biBitCount=8;
	bmfHdr.bfOffBits=1078;
	bmpHdr.biSizeImage=(((m_iWidth*8)+31)/32*4)*m_iHeight;
	bmfHdr.bfSize=bmfHdr.bfOffBits+bmpHdr.biSizeImage;

	for(int i=0;i<256;i++)
	{
		rgb[i].rgbBlue=i;
		rgb[i].rgbGreen=i;
		rgb[i].rgbRed=i;
		rgb[i].rgbReserved=i;
	}

	//将初始化好的位图文件头和位图信息头写入文件
	filebmp.Write(&bmfHdr,sizeof(bmfHdr));
    filebmp.Write(&bmpHdr,sizeof(bmpHdr));

	filebmp.Write(rgb,sizeof(RGBQUAD)*256);
    
	int h=m_iHeight;
    int w=m_iWidth;
	int iWidthBytes=bmpHdr.biSizeImage/m_iHeight;
    
	//每一行的字节数必须是四的倍数,不足补零
	//像素按照从下到上,从左到右的顺序排列
	int zero=0;
	for(int j=0;j<h;j++)
	{
	    filebmp.Write(pDIB+w*(h-j-1),w);
		if(w!=iWidthBytes)
			for(int k=0;k<iWidthBytes-w;k++)
				filebmp.Write(&zero,1);
	}

	::GlobalUnlock((HGLOBAL) hDIB);
	::GlobalFree((HGLOBAL) hDIB);
	fileraw.Close();
	filebmp.Close();

	CDialog::OnOK();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -