📄 dib.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 + -