// CombineBitmapDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "CombineBitmap.h"
#include "CombineBitmapDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CCombineBitmapDlg 对话框
CCombineBitmapDlg::CCombineBitmapDlg(CWnd* pParent /*=NULL*/)
: CDialog(CCombineBitmapDlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CCombineBitmapDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CCombineBitmapDlg, CDialog)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_BUTTON1, &CCombineBitmapDlg::OnBnClickedButton1)
ON_BN_CLICKED(IDC_BUTTON2, &CCombineBitmapDlg::OnBnClickedButton2)
END_MESSAGE_MAP()
// CCombineBitmapDlg 消息处理程序
BOOL CCombineBitmapDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void CCombineBitmapDlg::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
{
CDialog::OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CCombineBitmapDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
#define pixBytes 1
#define writePixBytes 4
#define WIDTHPIX 512
#define HEIGHTPIX 512
//#define ROWS 35
//#define COLS 35
#define planesSize 256*sizeof(RGBQUAD)
BOOL combine(int fffffff,int rt,int rb,int cl,int cr);
DWORD WINAPI c(LPVOID p);
struct _d{
int ffff;
int rt;
int rb;
int cl;
int cr;
};
DWORD WINAPI c(LPVOID p)
{
_d* d=(_d*)p;
combine(d->ffff,d->rt,d->rb,d->cl,d->cr);
return 0;
}
BOOL combine(int fffffff,int rt,int rb,int cl,int cr)
{
int ROWS=rb-rt;
int COLS=cr-cl;
//定义文件头结构
BITMAPFILEHEADER fileHead;
DWORD fileHeadLen = sizeof( BITMAPFILEHEADER );
//定义图象信息结构
BITMAPINFOHEADER bmpHead;
DWORD bmpHeadLen =sizeof( BITMAPINFOHEADER );
DWORD headSize=fileHeadLen+bmpHeadLen;
//zero struct
ZeroMemory(&fileHead,sizeof(BITMAPFILEHEADER));
ZeroMemory(&bmpHead,sizeof(BITMAPINFOHEADER));
DWORD filesize=headSize+(ROWS*HEIGHTPIX)*(COLS*WIDTHPIX)*writePixBytes;
//初始化文件头结构
fileHead.bfOffBits =headSize;
fileHead.bfReserved1=0;
fileHead.bfReserved2=0;
fileHead.bfSize = filesize;
fileHead.bfType = 0x4D42;
///初始图像信息结构
bmpHead.biBitCount = 32;
bmpHead.biCompression = BI_RGB;
bmpHead.biPlanes = 1;
bmpHead.biHeight = ROWS*HEIGHTPIX;
bmpHead.biWidth = COLS*WIDTHPIX;
bmpHead.biSize = bmpHeadLen;
CString fileName;
BYTE outBuffer[WIDTHPIX*writePixBytes];
BYTE towrite[WIDTHPIX*writePixBytes];
RGBQUAD planes[256];
HANDLE hBigFile;
CString bigFileName;
bigFileName.Format(TEXT("e://big%d.bmp"),fffffff);
hBigFile=CreateFile(bigFileName,FILE_ALL_ACCESS,FILE_SHARE_READ | FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
DWORD re=0;
if(hBigFile==INVALID_HANDLE_VALUE)
{
MessageBox(NULL,TEXT("创建BigFile失败"),TEXT(""),0);
}
else
{
// TCHAR filename[MAX_PATH];
SetFilePointer(hBigFile,0,NULL,FILE_BEGIN);
WriteFile(hBigFile,&fileHead,sizeof(fileHead),&re,NULL);
WriteFile(hBigFile,&bmpHead,sizeof(bmpHead),&re,NULL);
HANDLE hFile;
for(int i=0;i<ROWS;i++)
{
for(int j=0;j<COLS;j++)
{
// wsprintf(filename,_T("e://cutimage//%d_%d.bmp"),j,i);
// fileName.Format(_T("E://googlemap//zhongshang//16//zs1_2%d_%d.bmp"),i+rt,j+cl);
fileName.Format(_T("E://googlemap//m//%d_%d.bmp"),i+rt,j+cl);
hFile=CreateFile(fileName,FILE_ALL_ACCESS,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(hFile!=INVALID_HANDLE_VALUE)
{
SetFilePointer(hFile,headSize,NULL,FILE_BEGIN);
///读取调色板
/*memset(planes,0,sizeof(planes));
if(ReadFile(hFile,planes,sizeof(planes),&re,NULL)==0)
{
//MessageBox(TEXT("读取调色板发生错误"));
MessageBox(NULL,TEXT("读取调色板发生错误"),TEXT(""),0);
CloseHandle(hFile);
goto error;
}
*/
for(int row=0;row<HEIGHTPIX;row++)
{
SetFilePointer(hBigFile,headSize+(WIDTHPIX*COLS*HEIGHTPIX*(ROWS-1-i)+(WIDTHPIX*COLS*row)+(j*WIDTHPIX))*writePixBytes,NULL,FILE_BEGIN);
memset(outBuffer,0,sizeof(outBuffer));
if(ReadFile(hFile,outBuffer,sizeof(outBuffer),&re,NULL)!=0)
{
if(re<sizeof(outBuffer))
{
//MessageBox(_T("ReadFile发生错误"));
MessageBox(NULL,TEXT("ReadFile发生错误"),TEXT(""),0);
goto error;
}
else
{
/*memset(towrite,0,sizeof(towrite));
//处理调色板
for(int kkk=0; kkk<WIDTHPIX; kkk++)
{
*(towrite + kkk*3) = planes[outBuffer[kkk]].rgbBlue;
*(towrite + kkk*3 + 1) = planes[outBuffer[kkk]].rgbGreen;
*(towrite + kkk*3 + 2) = planes[outBuffer[kkk]].rgbRed;
}
*/
if(WriteFile(hBigFile,outBuffer,sizeof(outBuffer),&re,NULL)!=0)
{
if(re<sizeof(outBuffer))
{
MessageBox(NULL,TEXT("WriteFile发生错误"),TEXT(""),0);
//MessageBox(_T("WriteFile发生错误"));
CloseHandle(hFile);
goto error;
}
}
}
}
}
CloseHandle(hFile);
}
else
{
CString err;
err.Format(L"打开文件 %s 失败",fileName);
//MessageBox(err);
MessageBox(NULL,err,TEXT(""),0);
goto error;
}
}
}
goto end;
error:
//MessageBox(_T("合并位图发生错误,已终止"));
MessageBox(NULL,_T("合并位图发生错误,已终止"),TEXT(""),0);
CloseHandle(hBigFile);
return FALSE;
end:
FlushFileBuffers(hBigFile);
CloseHandle(hBigFile);
CString msg;
msg.Format(L"%d成功",fffffff);
MessageBox(NULL,msg,L"",0);
return TRUE;
}
}
_d dd[15];
int ff=0;
void CCombineBitmapDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
//0
/* dd[ff].ffff=ff;
dd[ff].rt=0;
dd[ff].rb=0+17;
dd[ff].cl=0;
dd[ff].cr=0+17;
CreateThread(NULL,0,c,&dd[ff],0,NULL);
*/
ff++;
//1
/*
dd[ff].ffff=ff;
dd[ff].rt=0;
dd[ff].rb=0+17;
dd[ff].cl=0+17;
dd[ff].cr=0+17+17;
CreateThread(NULL,0,c,&dd[ff],0,NULL);
*/
ff++;
//2
/*
dd[ff].ffff=ff;
dd[ff].rt=0;
dd[ff].rb=0+17;
dd[ff].cl=0+17+17;
dd[ff].cr=0+17+17+10;
//CreateThread(NULL,0,c,&dd[ff],0,NULL);
c(&dd[ff]);
*/
ff++;
/*
*/
/*
dd[ff].ffff=ff;
dd[ff].rt=0+17;
dd[ff].rb=0+17+17;
dd[ff].cl=0;
dd[ff].cr=0+17;
//CreateThread(NULL,0,c,&dd[ff],0,NULL);
c(&dd[ff]);
*/
ff++;
/* dd[ff].ffff=ff;
dd[ff].rt=0+17;
dd[ff].rb=0+17+17;
dd[ff].cl=0+17;
dd[ff].cr=0+17+17;
//CreateThread(NULL,0,c,&dd[ff],0,NULL);
c(&dd[ff]);
*/
ff++;
//5
/* dd[ff].ffff=ff;
dd[ff].rt=0+17;
dd[ff].rb=0+17+17;
dd[ff].cl=0+17+17;
dd[ff].cr=0+17+17+10;
CreateThread(NULL,0,c,&dd[ff],0,NULL);
*/
ff++;
/
//6
/* dd[ff].ffff=ff;
dd[ff].rt=0+17+17;
dd[ff].rb=0+17+17+17;
dd[ff].cl=0;
dd[ff].cr=0+17;
//CreateThread(NULL,0,c,&dd[ff],0,NULL);
c(&dd[ff]);
*/
ff++;
//7
/* dd[ff].ffff=ff;
dd[ff].rt=0+17+17;
dd[ff].rb=0+17+17+17;
dd[ff].cl=0+17;
dd[ff].cr=0+17+17;
//CreateThread(NULL,0,c,&dd[ff],0,NULL);
c(&dd[ff]);
*/
ff++;
//8
/* dd[ff].ffff=ff;
dd[ff].rt=0+17+17;
dd[ff].rb=0+17+17+17;
dd[ff].cl=0+17+17;
dd[ff].cr=0+17+17+10;
//CreateThread(NULL,0,c,&dd[ff],0,NULL);
c(&dd[ff]);
*/
ff++;
/
//9
/* dd[ff].ffff=ff;
dd[ff].rt=0+17+17+17;
dd[ff].rb=0+17+17+17+9;
dd[ff].cl=0;
dd[ff].cr=0+17;
//CreateThread(NULL,0,c,&dd[ff],0,NULL);
c(&dd[ff]);*/
ff++;
//10
/* dd[ff].ffff=ff;
dd[ff].rt=0+17+17+17;
dd[ff].rb=0+17+17+17+9;
dd[ff].cl=0+17;
dd[ff].cr=0+17+17;
//CreateThread(NULL,0,c,&dd[ff],0,NULL);
c(&dd[ff]);*/
ff++;
//11
dd[ff].ffff=ff;
dd[ff].rt=0+17+17+17;
dd[ff].rb=0+17+17+17+9;
dd[ff].cl=0+17+17;
dd[ff].cr=0+17+17+10;
//CreateThread(NULL,0,c,&dd[ff],0,NULL);
c(&dd[ff]);
ff++;
}
BOOL combineX(int fffffff,int iii)
{
//定义文件头结构
BITMAPFILEHEADER fileHead;
DWORD fileHeadLen = sizeof( BITMAPFILEHEADER );
//定义图象信息结构
BITMAPINFOHEADER bmpHead;
DWORD bmpHeadLen =sizeof( BITMAPINFOHEADER );
DWORD headSize=fileHeadLen+bmpHeadLen;
//zero struct
ZeroMemory(&fileHead,sizeof(BITMAPFILEHEADER));
ZeroMemory(&bmpHead,sizeof(BITMAPINFOHEADER));
DWORD filesize=headSize+8704*21*writePixBytes;
//初始化文件头结构
fileHead.bfOffBits =headSize;
fileHead.bfReserved1=0;
fileHead.bfReserved2=0;
fileHead.bfSize = filesize;
fileHead.bfType = 0x4D42;
///初始图像信息结构
bmpHead.biBitCount = 32;
bmpHead.biCompression = BI_RGB;
bmpHead.biPlanes = 1;
bmpHead.biHeight = 17*HEIGHTPIX;
bmpHead.biWidth = 21;
bmpHead.biSize = bmpHeadLen;
CString fileName;
BYTE outBuffer[21*writePixBytes];
BYTE towrite[WIDTHPIX*writePixBytes];
RGBQUAD planes[256];
HANDLE hBigFile;
CString bigFileName;
bigFileName.Format(TEXT("e://big%d_.bmp"),fffffff);
hBigFile=CreateFile(bigFileName,FILE_ALL_ACCESS,FILE_SHARE_READ | FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
DWORD re=0;
if(hBigFile==INVALID_HANDLE_VALUE)
{
MessageBox(NULL,TEXT("创建BigFile失败"),TEXT(""),0);
}
else
{
SetFilePointer(hBigFile,0,NULL,FILE_BEGIN);
WriteFile(hBigFile,&fileHead,sizeof(fileHead),&re,NULL);
WriteFile(hBigFile,&bmpHead,sizeof(bmpHead),&re,NULL);
HANDLE hFile;
for(int i=0;i<17;i++)
{
//for(int j=0;j<COLS;j++)
{
fileName.Format(_T("E://googlemap//m//%d_%d.bmp"),iii*17+i,0);
hFile=CreateFile(fileName,FILE_ALL_ACCESS,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(hFile!=INVALID_HANDLE_VALUE)
{
SetFilePointer(hFile,headSize,NULL,FILE_BEGIN);
for(int row=0;row<HEIGHTPIX;row++)
{
//SetFilePointer(hBigFile,headSize+((row*HEIGHTPIX)+(WIDTHPIX-21))*writePixBytes,NULL,FILE_BEGIN);
//SetFilePointer(hBigFile,headSize+(WIDTHPIX*HEIGHTPIX*(17-1-i)+(WIDTHPIX*1*row)+(WIDTHPIX-21))*writePixBytes,NULL,FILE_BEGIN);
SetFilePointer(hBigFile,headSize+(21*HEIGHTPIX*(17-1-i)+(21*row))*writePixBytes,NULL,FILE_BEGIN);
SetFilePointer(hFile,headSize+((HEIGHTPIX*row)+(512-21))*writePixBytes,NULL,FILE_BEGIN);
memset(outBuffer,0,sizeof(outBuffer));
if(ReadFile(hFile,outBuffer,sizeof(outBuffer),&re,NULL)!=0)
{
if(re<sizeof(outBuffer))
{
MessageBox(NULL,TEXT("ReadFile发生错误"),TEXT(""),0);
goto error;
}
else
{
if(WriteFile(hBigFile,outBuffer,sizeof(outBuffer),&re,NULL)!=0)
{
if(re<sizeof(outBuffer))
{
MessageBox(NULL,TEXT("WriteFile发生错误"),TEXT(""),0);
CloseHandle(hFile);
goto error;
}
}
}
}
}
CloseHandle(hFile);
}
else
{
CString err;
err.Format(L"打开文件 %s 失败",fileName);
//MessageBox(err);
MessageBox(NULL,err,TEXT(""),0);
goto error;
}
}
}
goto end;
error:
//MessageBox(_T("合并位图发生错误,已终止"));
MessageBox(NULL,_T("合并位图发生错误,已终止"),TEXT(""),0);
CloseHandle(hBigFile);
return FALSE;
end:
FlushFileBuffers(hBigFile);
CloseHandle(hBigFile);
CString msg;
msg.Format(L"%d成功",fffffff);
MessageBox(NULL,msg,L"",0);
return TRUE;
}
}
BOOL combineY(int fffffff,int iii)
{
//定义文件头结构
BITMAPFILEHEADER fileHead;
DWORD fileHeadLen = sizeof( BITMAPFILEHEADER );
//定义图象信息结构
BITMAPINFOHEADER bmpHead;
DWORD bmpHeadLen =sizeof( BITMAPINFOHEADER );
DWORD headSize=fileHeadLen+bmpHeadLen;
//zero struct
ZeroMemory(&fileHead,sizeof(BITMAPFILEHEADER));
ZeroMemory(&bmpHead,sizeof(BITMAPINFOHEADER));
DWORD filesize=headSize+8704*103*writePixBytes;
//初始化文件头结构
fileHead.bfOffBits =headSize;
fileHead.bfReserved1=0;
fileHead.bfReserved2=0;
fileHead.bfSize = filesize;
fileHead.bfType = 0x4D42;
///初始图像信息结构
bmpHead.biBitCount = 32;
bmpHead.biCompression = BI_RGB;
bmpHead.biPlanes = 1;
bmpHead.biHeight = 103;
bmpHead.biWidth = 17*HEIGHTPIX;
bmpHead.biSize = bmpHeadLen;
CString fileName;
BYTE outBuffer[WIDTHPIX*writePixBytes];
BYTE towrite[WIDTHPIX*writePixBytes];
RGBQUAD planes[256];
HANDLE hBigFile;
CString bigFileName;
bigFileName.Format(TEXT("e://big%d___.bmp"),fffffff);
hBigFile=CreateFile(bigFileName,FILE_ALL_ACCESS,FILE_SHARE_READ | FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
DWORD re=0;
if(hBigFile==INVALID_HANDLE_VALUE)
{
MessageBox(NULL,TEXT("创建BigFile失败"),TEXT(""),0);
}
else
{
SetFilePointer(hBigFile,0,NULL,FILE_BEGIN);
WriteFile(hBigFile,&fileHead,sizeof(fileHead),&re,NULL);
WriteFile(hBigFile,&bmpHead,sizeof(bmpHead),&re,NULL);
HANDLE hFile;
for(int i=0;i<17;i++)
{
//for(int j=0;j<COLS;j++)
{
fileName.Format(_T("E://googlemap//m//%d_%d.bmp"),0,iii*17+i);
hFile=CreateFile(fileName,FILE_ALL_ACCESS,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(hFile!=INVALID_HANDLE_VALUE)
{
SetFilePointer(hFile,headSize,NULL,FILE_BEGIN);
for(int row=512-103;row<512;row++)
{
//SetFilePointer(hBigFile,headSize+((row*HEIGHTPIX)+(WIDTHPIX-21))*writePixBytes,NULL,FILE_BEGIN);
//SetFilePointer(hBigFile,headSize+(WIDTHPIX*HEIGHTPIX*(17-1-i)+(WIDTHPIX*1*row)+(WIDTHPIX-21))*writePixBytes,NULL,FILE_BEGIN);
//SetFilePointer(hBigFile,headSize+(21*HEIGHTPIX*(17-1-i)+(21*row))*writePixBytes,NULL,FILE_BEGIN);
//SetFilePointer(hFile,headSize+((HEIGHTPIX*row)+(512-21))*writePixBytes,NULL,FILE_BEGIN);
//SetFilePointer(hBigFile,headSize+(103*512*i)*writePixBytes,NULL,FILE_BEGIN);
SetFilePointer(hBigFile,headSize+((WIDTHPIX*17*(row-(512-103)))+(i*WIDTHPIX))*writePixBytes,NULL,FILE_BEGIN);
SetFilePointer(hFile,headSize+(WIDTHPIX*row)*writePixBytes,NULL,FILE_BEGIN);
memset(outBuffer,0,sizeof(outBuffer));
if(ReadFile(hFile,outBuffer,sizeof(outBuffer),&re,NULL)!=0)
{
if(re<sizeof(outBuffer))
{
MessageBox(NULL,TEXT("ReadFile发生错误"),TEXT(""),0);
goto error;
}
else
{
if(WriteFile(hBigFile,outBuffer,sizeof(outBuffer),&re,NULL)!=0)
{
if(re<sizeof(outBuffer))
{
MessageBox(NULL,TEXT("WriteFile发生错误"),TEXT(""),0);
CloseHandle(hFile);
goto error;
}
}
}
}
}
CloseHandle(hFile);
}
else
{
CString err;
err.Format(L"打开文件 %s 失败",fileName);
//MessageBox(err);
MessageBox(NULL,err,TEXT(""),0);
goto error;
}
}
}
goto end;
error:
//MessageBox(_T("合并位图发生错误,已终止"));
MessageBox(NULL,_T("合并位图发生错误,已终止"),TEXT(""),0);
CloseHandle(hBigFile);
return FALSE;
end:
FlushFileBuffers(hBigFile);
CloseHandle(hBigFile);
CString msg;
msg.Format(L"%d成功",fffffff);
MessageBox(NULL,msg,L"",0);
return TRUE;
}
}
void CCombineBitmapDlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
combineY(9,0);
combineY(10,1);
//combineY(8,2);
}