位图合并

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

}

帮同事合并地图写的,比较乱

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值