// RawToBmpDlg.cpp : 实现文件//#include "stdafx.h"#include "RawToBmp.h"#include "RawToBmpDlg.h"#include "afxdialogex.h"#include "iostream"using namespace std;#ifdef _DEBUG#define new DEBUG_NEW#endif#define MAX 64// 用于应用程序“关于”菜单项的CAboutDlg 对话框class CAboutDlg : public CDialogEx{public:CAboutDlg();// 对话框数据enum { IDD = IDD_ABOUTBOX };protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持// 实现protected:DECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD){}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialogEx::DoDataExchange(pDX);}BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)END_MESSAGE_MAP()// CRawToBmpDlg 对话框CRawToBmpDlg::CRawToBmpDlg(CWnd* pParent /*=NULL*/): CDialogEx(CRawToBmpDlg::IDD, pParent){m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void CRawToBmpDlg::DoDataExchange(CDataExchange* pDX){CDialogEx::DoDataExchange(pDX);DDX_Control(pDX, IDC_EDIT_RAW, m_EditRaw);DDX_Control(pDX, IDC_EDIT_BMP, m_EditBmp);}BEGIN_MESSAGE_MAP(CRawToBmpDlg, CDialogEx)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(ID_CONVERT, &CRawToBmpDlg::OnBnClickedConvert) END_MESSAGE_MAP()// CRawToBmpDlg 消息处理程序BOOL CRawToBmpDlg::OnInitDialog(){CDialogEx::OnInitDialog();// 将“关于...”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){BOOL bNameValid;CString strAboutMenu;bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// 设置此对话框的图标。
当应用程序主窗口不是对话框时,框架将自动// 执行此操作SetIcon(m_hIcon, TRUE); // 设置大图标SetIcon(m_hIcon, FALSE); // 设置小图标// TODO: 在此添加额外的初始化代码return TRUE; // 除非将焦点设置到控件,否则返回TRUE}void CRawToBmpDlg::OnSysCommand(UINT nID, LPARAM lParam){if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialogEx::OnSysCommand(nID, lParam);}}// 如果向对话框添加最小化按钮,则需要下面的代码// 来绘制该图标。
对于使用文档/视图模型的MFC 应用程序,// 这将由框架自动完成。
void CRawToBmpDlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); // 用于绘制的设备上下文SendMessage(WM_ICONERASEBKGND,reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);// 使图标在工作区矩形中居中int cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// 绘制图标dc.DrawIcon(x, y, m_hIcon);}else{CDialogEx::OnPaint();}}//当用户拖动最小化窗口时系统调用此函数取得光标//显示。
HCURSOR CRawToBmpDlg::OnQueryDragIcon(){return static_cast<HCURSOR>(m_hIcon);}void CRawToBmpDlg::OnBnClickedConvert() //点击转换按钮,触发此函数{CString strBmp;CString strRaw;FILE* FileRaw;char* RawImage[1000];int i = 0;int ImageWidth = 512;int ImageHeight = 512;int iTemp = ImageWidth;int iReturn = 0;HANDLE hFileBmp = NULL;RGBQUAD rgb;char* Rawpathchar = NULL;WCHAR* Rawpathwchar = NULL;char* Bmppathchar = NULL;WCHAR* Bmppathwchar = NULL;BITMAPFILEHEADER BmpFileHeader;BITMAPINFOHEADER BmpInfoHeader;m_EditRaw.GetWindowText(strRaw); //获得RAW编辑框写入内容即将m_EditRaw 条目写入缓冲区即RAW文件路径m_EditBmp.GetWindowText(strBmp); //获得BMP编辑框写入内容即将m_EditBmp 条目写入缓冲区即BMP文件路径Rawpathwchar = strRaw.GetBuffer(0);Rawpathchar = WcharToChar(Rawpathwchar); //格式转化Bmppathwchar = strBmp.GetBuffer(0);Bmppathchar = WcharToChar(Bmppathwchar);FileRaw = fopen(Rawpathchar,"rb"); //打开文件if (FileRaw == NULL){MessageBox(L"RAW文件路径错误",L"Error",MB_ICONERROR | MB_OK);return;}for (i=0;i<512;i++){RawImage[i] = (char*)malloc(512); //申请内存memset(RawImage[i],0,512); //初始化内存iReturn = fread(RawImage[i],1,512,FileRaw); //获取raw文件信息if (iReturn == 0){MessageBox(L"读取失败",L"Error",MB_ICONERROR | MB_OK);for (int j=0;j<i+1;j++){free(RawImage[i]); //释放内存}fclose(FileRaw); //关闭Raw文件return;}}fclose(FileRaw); //关闭RAW文件if (iTemp%4 != 0) //被四整除{iTemp = iTemp + (4-iTemp%4);}//创建BMP文件hFileBmp = CreateFile(strBmp,GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FIL E_ATTRIBUTE_NORMAL,NULL);if (hFileBmp == NULL){MessageBox(L"创建失败",L"Error",MB_ICONERROR | MB_OK);return;}//设置文件头BmpFileHeader.bfType = ((WORD)('M'<<8)|'B');BmpFileHeader.bfReserved1=0;//保留BmpFileHeader.bfReserved2=0;//保留BmpFileHeader.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+s izeof(RGBQUAD)*256 + iTemp*ImageHeight; //文件大小BmpFileHeader.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER )+sizeof(RGBQUAD)*256;BmpInfoHeader.biSize=sizeof(BITMAPINFOHEADER); //说明BITMAPINFOHEADER 结构所需的字数BmpInfoHeader.biWidth = ImageWidth; //图像宽度,以像素为单位BmpInfoHeader.biHeight = ImageHeight; //图像高度,以像素为单位BmpInfoHeader.biPlanes=1; //为目标设备说明位面数,其中总是被设为1BmpInfoHeader.biBitCount=8; //说明比特数/像素的颜色深度,值为0,1,4,8,16,24或32,256灰度级的颜色深度为8,因为2^8=256BmpInfoHeader.biCompression=BI_RGB; //说明图像数据压缩类型BmpInfoHeader.biSizeImage=iTemp*ImageHeight; //说明图像的大小,一字节为单位,BmpInfoHeader.biXPelsPerMeter=0; //水平分辨率,可以设为0BmpInfoHeader.biYPelsPerMeter=0; //垂直分辨率,可以设为0BmpInfoHeader.biClrUsed=256; //说明位图实际使用的彩色表中颜色索引数BmpInfoHeader.biClrImportant=0; //说明对图像显示有重要影响的颜色索引数目,为0表示都重要。