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

📄 dib.cpp

📁 c++写的一个 数字图像处理的程序
💻 CPP
字号:
// Dib.cpp: implementation of the CDib class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Bmp.h"
#include "Dib.h"

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

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CDib::CDib()
{
   isLoad=0;
}

CDib::~CDib()
{

}
/*********Reading BMP***********************/
void CDib::readfile(CString filename)
{

   CFile file;
	if(file.Open(filename,CFile::modeRead|CFile::shareDenyNone,NULL)==0)
		{
			AfxMessageBox("Can't Open the File",MB_OK,0);
			return;
		}
	file.Read(&bf,sizeof(bf));
	if(bf.bfType!=0x4d42)
		{
			AfxMessageBox("Non-BMP",MB_OK,0);
			return;
		}
	if(file.GetLength()!=bf.bfSize)
		{
			AfxMessageBox("The File is dameged,please Check!",MB_OK,0);
			return;
		}
	file.Read(&bi,sizeof(bi));
	OldHeight=bi.biHeight;
	OldWidth=bi.biWidth;
	numQuad=0;
	if(bi.biBitCount<24)
		{
			numQuad=1<<bi.biBitCount;
		}
	
	pbi=(BITMAPINFO*)HeapAlloc(GetProcessHeap(),0,sizeof(BITMAPINFOHEADER)+numQuad*sizeof(RGBQUAD));
	memcpy(pbi,&bi,sizeof(bi));
	quad=(RGBQUAD*)((BYTE*)pbi+sizeof(BITMAPINFOHEADER));
	if(numQuad!=0)
		{
		    file.Read(quad,sizeof(RGBQUAD)*numQuad);
		}

	bi.biSizeImage=bf.bfSize-bf.bfOffBits;
	lpBuf=(BYTE*)(HeapAlloc(GetProcessHeap(),0,bi.biSizeImage));
	ShowData=(BYTE*)(HeapAlloc(GetProcessHeap(),0,bi.biSizeImage));
	file.Read(lpBuf,bi.biSizeImage);
	memcpy(ShowData,lpBuf,bi.biSizeImage);
	file.Close();

	iFileHeight=OldHeight;
	iFileWidth=OldWidth;
	isLoad=1;
}

/*****************Show image***************************/
void CDib::draw(CDC *pDC, BYTE *ShowData)
{ 
  int Result =    StretchDIBits(pDC->m_hDC,
		          0,0,iFileWidth,iFileHeight,
				  0,0,iFileWidth,iFileHeight,
				  ShowData,
				  pbi,
				  DIB_RGB_COLORS,
				  SRCCOPY);
	if(Result == GDI_ERROR)  AfxMessageBox("draw error");
}



/*****************Save File***************************/
//File Name..............filename
void CDib::writefile(CString filename)
{
    CFile file;
	if(file.Open(filename,CFile::modeCreate|CFile::modeReadWrite,NULL)==0)
		{
			AfxMessageBox("Can't Save the File",MB_OK,0);
			return;
		}
	
	file.Write(&bf,sizeof(bf));

	bi.biHeight=iFileHeight;
	bi.biWidth=iFileWidth;
	bi.biSizeImage=(iFileWidth*bi.biBitCount+31)/32*4*iFileHeight;
	file.Write(&bi,sizeof(BITMAPINFOHEADER));
	file.Write(quad,numQuad*sizeof(RGBQUAD));
	BYTE* lDsc=(BYTE*)(HeapAlloc(GetProcessHeap(),0,bi.biSizeImage));
//
	if(bi.biBitCount==24)
	{
		for(int i=0;i<iFileHeight;i++)
	    for(int j=0;j<iFileWidth;j++)
		{
           *(lDsc+3*(i*iFileWidth+j))=*(ShowData+3*(i*OldWidth+j));
		   *(lDsc+3*(i*iFileWidth+j)+1)=*(ShowData+3*(i*OldWidth+j)+1);
		   *(lDsc+3*(i*iFileWidth+j)+2)=*(ShowData+3*(i*OldWidth+j)+2);
		}
	}
    else                             //BMP is not 24-Byte
	{
		for(int i=0;i<iFileHeight;i++)
	    for(int j=0;j<iFileWidth;j++)
           *(lDsc+i*iFileWidth+j)=*(ShowData+i*OldWidth+j);
	}
	file.Write(lDsc,bi.biSizeImage);
	file.SetLength(bf.bfSize);
	file.Close();
	HeapFree(GetProcessHeap(),0,lDsc);
}
//*******************************************/
//
//*********************************************
void CDib::AtoColor(){
	int i,j,k,e,N=127;
	int jk=bi.biBitCount;
	if(bi.biBitCount==24)//Processing RGB
	{
		//No Edge
		for(k=0;k<=2;k++) {
			for(i=0;i<iFileHeight-1;i++) for(j=0;j<iFileWidth-1;j++){
			BYTE R=*(ShowData+3*(i*iFileWidth+j));
			BYTE R1=*(ShowData+3*(i*iFileWidth+j+1));
			BYTE R2=*(ShowData+3*((i+1)*iFileWidth+j-1));
			BYTE R3=*(ShowData+3*((i+1)*iFileWidth+j));
			BYTE R4=*(ShowData+3*((i+1)*iFileWidth+j+1));
		if(R<=N)
		{*(ShowData+3*(i*iFileWidth+j)+k)=BYTE(0);e=R;}
		else{*(ShowData+3*(i*iFileWidth+j)+k)=BYTE(255);e=R-255;}

		*(ShowData+3*(i*iFileWidth+j+1)+k)=BYTE(R1+e*7/16);
		*(ShowData+3*((i+1)*iFileWidth+j-1)+k)=BYTE(R1+e*3/16);
		*(ShowData+3*((i+1)*iFileWidth+j)+k)=BYTE(R1+e*5/16);
		*(ShowData+3*((i+1)*iFileWidth+j+1)+k)=BYTE(R1+e*1/16);
		}
			//Deal with Edge
			for(i=iFileHeight-1,j=0;j<iFileWidth;j++){
				BYTE R=*(ShowData+3*(i*iFileWidth+j)+k);
				if(R<=N) *(ShowData+3*(i*iFileWidth+j)+k)=BYTE(0);
				else *(ShowData+3*(i*iFileWidth+j)+k)=BYTE(255);
			}
			for(j=iFileWidth-1,i=0;i<iFileHeight;i++){
				BYTE R=*(ShowData+3*(i*iFileWidth+j)+k);
				if(R<=N) *(ShowData+3*(i*iFileWidth+j)+k)=BYTE(0);
				else *(ShowData+3*(i*iFileWidth+j)+k)=BYTE(255);
			}
		}
	}
	else//Processing the Gray map
	{
		//No Edge
		for(i=0;i<iFileHeight-1;i++) for(j=0;j<iFileWidth-1;j++){

			BYTE T=*(ShowData+(i*iFileWidth+j));
			BYTE T1=*(ShowData+(i*iFileWidth+j+1));
			BYTE T2=*(ShowData+((i+1)*iFileWidth+j-1));
			BYTE T3=*(ShowData+((i+1)*iFileWidth+j));
			BYTE T4=*(ShowData+((i+1)*iFileWidth+j+1));
			if(T<=N)
			{*(ShowData+(i*iFileWidth+j))=BYTE(0);e=T;}
			else
			{*(ShowData+(i*iFileWidth+j))=BYTE(255);e=T-255;}
		*(ShowData+(i*iFileWidth+j+1))=BYTE(T1+e*7/16);
		*(ShowData+((i+1)*iFileWidth+j-1))=BYTE(T2+e*3/16);
		*(ShowData+((i+1)*iFileWidth+j))=BYTE(T3+e*5/16);
		*(ShowData+((i+1)*iFileWidth+j+1))=BYTE(T4+e*1/16);//Code of Error diffusion
		}
		//Deal with Edge
		for(i=iFileHeight-1,j=0;j<iFileWidth;j++){
				BYTE R=*(ShowData+(i*iFileWidth+j));
				if(R<=N) *(ShowData+(i*iFileWidth+j))=BYTE(0);
				else *(ShowData+(i*iFileWidth+j))=BYTE(255);
			}
			for(j=iFileWidth-1,i=0;i<iFileHeight;i++){
				BYTE R=*(ShowData+(i*iFileWidth+j));
				if(R<=N) *(ShowData+(i*iFileWidth+j))=BYTE(0);
				else *(ShowData+(i*iFileWidth+j))=BYTE(255);
			}
	}
}

⌨️ 快捷键说明

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