📄 rawtobmp.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 + -