📄 dib.cpp
字号:
// Dib.cpp: implementation of the CDib class.
//
//////////////////////////////////////////////////////////////////////
//#include "stdafx.h"
//#include "VcPrj.h"
#include "Dib.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CDib::CDib()
{
memset(pDIBDeal,0,sizeof(BYTE)*640*480);
memset(pDIBData,0,sizeof(BYTE)*640*480);
}
CDib::~CDib()
{
}
BOOL CDib::LoadFromFile(LPCTSTR bmpfile)
{
CFile myfile;
CFileException fileException;
BITMAPINFO bif;
BITMAPFILEHEADER bfh;
BITMAPINFOHEADER bih;
DWORD dataBytes;
if(!myfile.Open(bmpfile,CFile::modeReadWrite,&fileException)){
TRACE("文件无法打开! %s,error=%u\n",bmpfile,fileException.m_cause);
return false;
}
myfile.Seek(0,CFile::begin);
if(myfile.Read(&bfh,sizeof(bfh))!=sizeof(bfh)){
AfxMessageBox("读取文件出错!");
return false;
}
if(bfh.bfType!=0x4d42){ // 'BM'
AfxMessageBox("不是一个位图文件!");
return false;
}
if(myfile.Read(&bih,sizeof(bih))!=sizeof(bih)){
AfxMessageBox("读取文件出错!");
return false ;
}
if(!(bih.biBitCount != 1 ||bih.biBitCount != 8)){ // ''
TRACE("不是灰度图像!");
return false;
}
if(bih.biCompression!=0 ){
AfxMessageBox("是压缩图像");
return FALSE;
}
if(bih.biHeight * bih.biWidth > 640*480){
AfxMessageBox("长度或宽度不满足要求!");
return FALSE;
}
myfile.Seek(sizeof(bfh),CFile::begin);
if(myfile.Read(&bif,sizeof(bif))!=sizeof(bif)){
AfxMessageBox("读取文件出错!");
return false;
}
memcpy(&m_pBMI,&bif,sizeof(BITMAPINFO));
dataBytes=bfh.bfSize-bfh.bfOffBits;
myfile.Seek(0,CFile::begin);
myfile.Seek(bfh.bfOffBits,CFile::begin);
if(myfile.Read(pDIBData,dataBytes)!=dataBytes){
AfxMessageBox("读取位图文件出错 !");
return false;
}
myfile.Close();
// m_pDIBData = pDIBData;
memcpy(pDIBDeal,pDIBData,sizeof(pDIBData));
return TRUE;
}
int CDib::GetDibWidth(void)
{
return m_pBMI.bmiHeader.biWidth;
}
int CDib::GetDibHeight(void)
{
return m_pBMI.bmiHeader.biHeight;
}
int CDib::WriteToFile(LPCTSTR lpfilename)
{
BITMAPFILEHEADER bmphdr ;
RGBQUAD rgb[256];
FILE * fi;
int colorused ;
for(int i = 0; i < 256; i++){
rgb[i].rgbBlue = i;
rgb[i].rgbGreen = i;
rgb[i].rgbRed = i;
rgb[i].rgbReserved = 0;
}
colorused = 256 ;
if( m_pBMI.bmiHeader.biBitCount != 8 ){
return FALSE;
}
int bpl = ((m_pBMI.bmiHeader.biWidth * m_pBMI.bmiHeader.biBitCount + 31) & ~31) >> 3;
bmphdr.bfOffBits=sizeof(BITMAPFILEHEADER)+m_pBMI.bmiHeader.biSize+colorused*sizeof(RGBQUAD);
bmphdr.bfReserved1=0;
bmphdr.bfReserved2=0;
bmphdr.bfSize=bmphdr.bfOffBits+bpl*m_pBMI.bmiHeader.biHeight;
bmphdr.bfType=19778;
fi=fopen(lpfilename, "wb");
if (fi==NULL) return FALSE;
fwrite(&bmphdr,sizeof(BITMAPFILEHEADER),1,fi);
fwrite(&m_pBMI.bmiHeader,sizeof(BITMAPINFOHEADER), 1, fi);
fwrite(rgb,colorused*sizeof(RGBQUAD),1,fi);
fwrite(pDIBData,1,bpl*abs(m_pBMI.bmiHeader.biHeight),fi);
fclose(fi);
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -