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

📄 dibdoc.cpp

📁 本程序为图象处理,可将八位图转换为二十四位图
💻 CPP
字号:
// DIBDoc.cpp : implementation of the CDIBDoc class
//

#include "stdafx.h"
#include "DIB.h"
#include "DIBView.h"
//#include "AttributiDia.h "

#include "DIBDoc.h"

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

/////////////////////////////////////////////////////////////////////////////
// CDIBDoc

IMPLEMENT_DYNCREATE(CDIBDoc, CDocument)

BEGIN_MESSAGE_MAP(CDIBDoc, CDocument)
	//{{AFX_MSG_MAP(CDIBDoc)
	ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
	ON_COMMAND(ID_8TO24, On8to24)
	ON_COMMAND(ID_SAVE, OnSave)
	ON_COMMAND(ID_BACK, OnBack)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDIBDoc construction/destruction

CDIBDoc::CDIBDoc()
{
	pdib=NULL;
	pdib=NULL;
	Flag=0;
	pfileheader=NULL;
	// TODO: add one-time construction code here

}

CDIBDoc::~CDIBDoc()
{

}

BOOL CDIBDoc::OnNewDocument()
{
	if (!CDocument::OnNewDocument())
		return FALSE;

	// TODO: add reinitialization code here
	// (SDI documents will reuse this document)

	return TRUE;
}



/////////////////////////////////////////////////////////////////////////////
// CDIBDoc serialization

void CDIBDoc::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
	{
		// TODO: add storing code here
	}
	else
	{
		// TODO: add loading code here
	}
}

/////////////////////////////////////////////////////////////////////////////
// CDIBDoc diagnostics

#ifdef _DEBUG
void CDIBDoc::AssertValid() const
{
	CDocument::AssertValid();
}

void CDIBDoc::Dump(CDumpContext& dc) const
{
	CDocument::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CDIBDoc commands

void CDIBDoc::OnFileOpen() 
{
	CFile file;
	CFileException fe;
	CString filename;
	CString strOpenFilter="位图文件(*.bmp;*.dib)|*.bmp;*dib|所有文件(*.*)|*.*||";
	CFileDialog FileDlg(TRUE,"*.bmp",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,strOpenFilter);
	if(FileDlg.DoModal()==IDOK)
	{
	filename.Format("%s",FileDlg.GetPathName());
	file.Open(filename,CFile::modeRead|CFile::shareDenyWrite,&fe);

	BITMAPFILEHEADER bmfHeader;

	dwBitsSize=file.GetLength();


	file.Read((LPSTR)&bmfHeader,sizeof(bmfHeader));//读入数据

	if(bmfHeader.bfType!=0x4d42)
	{
		CString strMsg;
		strMsg="这不是BMP图";
		MessageBox(NULL,strMsg,NULL,MB_ICONINFORMATION|MB_OK);
		file.Close();
		return;
	}
	file.Close();
	if(!file.Open(filename,CFile::modeRead|CFile::shareDenyWrite,&fe))
	{
		return;
	}
//	pdib=(LPSTR)malloc(dwBitsSize*sizeof(LPSTR));
	pdib=(LPSTR)malloc(dwBitsSize*sizeof(BYTE));
	
	file.Read((BYTE*)pdib,dwBitsSize);
	file.Close();

//	WORD w=bitinfo->bfType;

	Width=DIBWidth();
	Height=DIBHeight();
	BitData=FindData();
	BitInfo=pdib+sizeof(BITMAPFILEHEADER);

	Oldpdib=pdib;
	OldInfo=BitInfo;
	OldData=BitData;
	Flag=1;

	CString str;
	str.Format("这是文档");
	UpdateAllViews(NULL);
	return;
	}
	return;
}

LONG CDIBDoc::DIBWidth()
{
	BITMAPINFOHEADER *bitinfo=(BITMAPINFOHEADER*)(pdib+sizeof(BITMAPFILEHEADER));
		return bitinfo->biWidth;

}

LONG CDIBDoc::DIBHeight()
{
	BITMAPINFOHEADER *bitinfo=(BITMAPINFOHEADER*)(pdib+sizeof(BITMAPFILEHEADER));
		return bitinfo->biHeight;

}

BYTE* CDIBDoc::FindData()
{
	int num;
	BITMAPINFOHEADER *bitinfo=(BITMAPINFOHEADER*)(pdib+sizeof(BITMAPFILEHEADER));
	bitnum=bitinfo->biBitCount;
/*	switch(bitnum)
	{
	case 1 : num=2;
	case 4 : num=16;
	case 8 : num=256;
	default : num=0;
	}*/
	num=(int)((BITMAPFILEHEADER*)pdib)->bfOffBits;
	return (BYTE*)pdib+num;
//	return pdib+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+num*sizeof(RGBQUAD);

}



void CDIBDoc::On8to24() 
{
	BITMAPFILEHEADER *pbitfile=(BITMAPFILEHEADER*)pdib;
	BITMAPINFOHEADER *pbitinfo=(BITMAPINFOHEADER*)BitInfo;
	if((pbitinfo->biBitCount)!=8)
	{
		AfxMessageBox("这不是256色位图!");
		return;
	}
//	BITMAPFILEHEADER 
	pfileheader=(BITMAPFILEHEADER*) malloc(sizeof(BITMAPFILEHEADER));
	pfileheader->bfType=0X4D42;
	pfileheader->bfSize=Height*Width*3+(Width*3)%4*Height+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
	pfileheader->bfReserved1=0;
	pfileheader->bfReserved2=0;
	pfileheader->bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);

//	BITMAPINFOHEADER 
	pinfoheader=(BITMAPINFOHEADER*) malloc(sizeof(BITMAPINFOHEADER));
	pinfoheader->biSize=sizeof(BITMAPINFOHEADER);
	pinfoheader->biWidth=Width;
	pinfoheader->biHeight=Height;
	pinfoheader->biPlanes=1;
	pinfoheader->biBitCount=24;
	pinfoheader->biCompression=0;
	pinfoheader->biSizeImage=Height*Width*3+(Width*3)%4*Height;
	pinfoheader->biXPelsPerMeter=pinfoheader->biXPelsPerMeter;
	pinfoheader->biYPelsPerMeter=pinfoheader->biYPelsPerMeter;
	pinfoheader->biClrUsed=0;
	pinfoheader->biClrImportant=0;

	LPSTR palette=pdib+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
	pdata=(BYTE*)malloc(sizeof(BYTE)*Width*Height*3+(Width*3)%4*Height);


	BYTE r,g,b,l;
	int ih,iw,sum,num1,num2,i;
	num1=Width%4;
	for(ih=0;ih<Height;ih++)
	{
		for(iw=0;iw<Width;iw++)
		{
			l=*(BitData+ih*Width+iw+num1*ih);
			b=*(palette+l*4);
			g=*(palette+l*4+1);
			r=*(palette+l*4+2);
			*pdata++=b;
			*pdata++=g;
			*pdata++=255;	
		}
		for(i=0;i<(Width*3)%4;i++)
		{
			*pdata++=0;
		
		}
	}


		pdata=pdata-Width*Height*3-(Width*3)%4*Height;	



		pdib=(LPSTR)pfileheader;
		BitData=pdata;
		BitInfo=(LPSTR)pinfoheader;
		UpdateAllViews(NULL);

	return;

	
}



void CDIBDoc::OnSave() 
{
	if(pfileheader==NULL)
	{
		AfxMessageBox("还没有经过处理");
		return;
	}
	CString filename;
	CString strOpenFilter="位图文件(*.bmp)|*.bmp|所有文件(*.*)|*.*||";
	CFileDialog FileDlg(FALSE,"*.bmp",NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,strOpenFilter);

	if(FileDlg.DoModal()==IDOK)
	{
	filename.Format("%s",FileDlg.GetPathName());
	CFile file;
	CFileException fe;

	if(!file.Open(filename,CFile::modeCreate|CFile::modeReadWrite|CFile::shareExclusive,&fe))
	{	
		return;
	}
	CString str;
	str.Format(filename);

	file.Write((LPSTR)pfileheader,sizeof(BITMAPFILEHEADER));
	file.Write((LPSTR)pinfoheader,sizeof(BITMAPINFOHEADER));
	file.Write((LPSTR)pdata, sizeof(BYTE)*Width*Height*3+(Width*3)%4*Height);
	file.Close();
	return;
	}
	return;
}


void CDIBDoc::OnBack() 
{
	pdib=Oldpdib;
	BitData=OldData;
	BitInfo=OldInfo;
	UpdateAllViews(NULL);	
}

⌨️ 快捷键说明

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