/* -------------------------------------------------------------------------
// 文件名 : BmpBase.cpp
// 创建者 : 冯仁昌
// 创建时间 : 2009-2-16 10:04:05
// 功能描述 :
//
// $Id: $
// -----------------------------------------------------------------------*/
#include "stdafx.h"
#include "BmpBase.h"
#include <exception>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
// $Log: $
BmpBase::BmpBase()
{
m_lpDib=NULL;//初始化m_lpDib为空。
m_pImgData=NULL; // 图像数据指针为空
m_lpBmpInfoHead=NULL; // 图像信息头指针为空
dataLen=0;
}
BmpBase::~BmpBase()
{
//释放m_lpDib所指向的内存缓冲区
if(m_lpDib != NULL)
delete [] m_lpDib;
}
void BmpBase::Empty()
{
if(m_lpDib != NULL)
{
delete m_lpDib;
m_lpDib = NULL;
m_lpColorTable = NULL;
m_pImgData = NULL;
m_lpBmpInfoHead = NULL;
}
}
CSize BmpBase::GetDimensions()
{
if(m_pImgData == NULL)
return CSize(0, 0);
return CSize(m_imgWidth, m_imgHeight);
}
int BmpBase::ComputeColorTabalLength(int nBitCount)
{
int colorTableLength;
switch(nBitCount)
{
case 1:
colorTableLength = 2;
break;
case 4:
colorTableLength = 16;
break;
case 8:
colorTableLength = 256;
break;
case 16:
case 24:
case 32:
colorTableLength = 0;
break;
default:
break;
}
return colorTableLength;
}
BOOL BmpBase::Read(LPCTSTR lpszPathName)
{
FILE *fp;
fopen_s(&fp, lpszPathName, "rb");
if(fp == NULL)
return FALSE;
int nFileLength;
try
{
Empty();
//求文件的长度
fseek(fp, 0, SEEK_END);
nFileLength = ftell(fp);
m_nFileSize = nFileLength;
fseek(fp, 0, SEEK_SET);
//读取BITMAPFILEHEADER结构到变量bmfh中
fread((LPVOID)&m_BmpFileHead, sizeof(BITMAPFILEHEADER), 1, fp);
if(m_lpDib != NULL)
delete []m_lpDib;
m_lpDib = new BYTE[nFileLength - sizeof(BITMAPFILEHEADER)];
fread(m_lpDib, nFileLength - sizeof(BITMAPFILEHEADER), 1, fp);
//m_lpBmpInfoHead位置为m_lpDib的起始位置
m_lpBmpInfoHead = (LPBITMAPINFOHEADER)m_lpDib;
m_imgWidth = m_lpBmpInfoHead->biWidth;
m_imgHeight = m_lpBmpInfoHead->biHeight;
m_nBitCount = m_lpBmpInfoHead->biBitCount;
//计算颜色表长度
m_nColorTableLength = ComputeColorTabalLength(m_lpBmpInfoHead->biBitCount);
if(m_nColorTableLength != 0)
{
m_lpColorTable = (LPRGBQUAD)(m_lpDib + sizeof(BITMAPINFOHEADER));
}
m_pImgData = (LPBYTE)(m_lpDib + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * m_nColorTableLength);
int imgBufSize = (m_imgWidth * m_nBitCount / 8 + 3) / 4 * 4 * m_imgHeight;
int offSet = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * m_nColorTableLength + imgBufSize;
fseek(fp, offSet, SEEK_SET);
if (!feof(fp))
{
FILE *frest = NULL;
fopen_s(&frest, "c:\\rest", "wb");
char buf[65536];
int c = 0;
while (c = fread(buf, 1, sizeof(buf), fp))
{
int d = fwrite(buf, c, 1, frest);
}
fclose(frest);
}
}
catch (CException* e)
{
fclose(fp);
e = NULL;
return FALSE;
}
fclose(fp);
nFileLength = m_imgHeight * (m_imgWidth * m_nBitCount / 8 + 3) / 4 * 4 + sizeof(BITMAPINFOHEADER) +
sizeof(BITMAPFILEHEADER) + m_nColorTableLength * sizeof(RGBQUAD);
// if(m_nFileSize != nFileLength)
// return FALSE;
return TRUE;
}
BOOL BmpBase::Write(LPCTSTR lpszPathName)
{
FILE *fp;
fopen_s(&fp, lpszPathName, "wb");
if(fp == NULL)
return FALSE;
BITMAPFILEHEADER bmfh;
bmfh.bfType = 0x4d42;
bmfh.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) +
sizeof(RGBQUAD) * m_nColorTableLength + (m_imgWidth * m_nBitCount / 8 + 3) / 4 * 4 * m_imgHeight;
bmfh.bfReserved1 = bmfh.bfReserved2 = 0;
bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * m_nColorTableLength;
try
{
fwrite((LPVOID)&bmfh, sizeof(BITMAPFILEHEADER), 1, fp);
fwrite(m_lpBmpInfoHead, sizeof(BITMAPINFOHEADER), 1, fp);
if(m_nColorTableLength != 0)
fwrite(m_lpColorTable, sizeof(RGBQUAD) * m_nColorTableLength, 1, fp);
int imgBufSize = (m_imgWidth * m_nBitCount / 8 + 3) / 4 * 4 * m_imgHeight;
fwrite(m_pImgData, imgBufSize, 1, fp);
}
catch (CException* e)
{
DeleteObject(e);
fclose(fp);
return FALSE;
}
fclose(fp);
return TRUE;
}
int BmpBase::GetFileSize()
{
return m_nFileSize;
}
// 文件名 : BmpBase.cpp
// 创建者 : 冯仁昌
// 创建时间 : 2009-2-16 10:04:05
// 功能描述 :
//
// $Id: $
// -----------------------------------------------------------------------*/
#include "stdafx.h"
#include "BmpBase.h"
#include <exception>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
// -------------------------------------------------------------------------
// -------------------------------------------------------------------------
// $Log: $
BmpBase::BmpBase()
{
m_lpDib=NULL;//初始化m_lpDib为空。
m_pImgData=NULL; // 图像数据指针为空
m_lpBmpInfoHead=NULL; // 图像信息头指针为空
dataLen=0;
}
BmpBase::~BmpBase()
{
//释放m_lpDib所指向的内存缓冲区
if(m_lpDib != NULL)
delete [] m_lpDib;
}
void BmpBase::Empty()
{
if(m_lpDib != NULL)
{
delete m_lpDib;
m_lpDib = NULL;
m_lpColorTable = NULL;
m_pImgData = NULL;
m_lpBmpInfoHead = NULL;
}
}
CSize BmpBase::GetDimensions()
{
if(m_pImgData == NULL)
return CSize(0, 0);
return CSize(m_imgWidth, m_imgHeight);
}
int BmpBase::ComputeColorTabalLength(int nBitCount)
{
int colorTableLength;
switch(nBitCount)
{
case 1:
colorTableLength = 2;
break;
case 4:
colorTableLength = 16;
break;
case 8:
colorTableLength = 256;
break;
case 16:
case 24:
case 32:
colorTableLength = 0;
break;
default:
break;
}
return colorTableLength;
}
BOOL BmpBase::Read(LPCTSTR lpszPathName)
{
FILE *fp;
fopen_s(&fp, lpszPathName, "rb");
if(fp == NULL)
return FALSE;
int nFileLength;
try
{
Empty();
//求文件的长度
fseek(fp, 0, SEEK_END);
nFileLength = ftell(fp);
m_nFileSize = nFileLength;
fseek(fp, 0, SEEK_SET);
//读取BITMAPFILEHEADER结构到变量bmfh中
fread((LPVOID)&m_BmpFileHead, sizeof(BITMAPFILEHEADER), 1, fp);
if(m_lpDib != NULL)
delete []m_lpDib;
m_lpDib = new BYTE[nFileLength - sizeof(BITMAPFILEHEADER)];
fread(m_lpDib, nFileLength - sizeof(BITMAPFILEHEADER), 1, fp);
//m_lpBmpInfoHead位置为m_lpDib的起始位置
m_lpBmpInfoHead = (LPBITMAPINFOHEADER)m_lpDib;
m_imgWidth = m_lpBmpInfoHead->biWidth;
m_imgHeight = m_lpBmpInfoHead->biHeight;
m_nBitCount = m_lpBmpInfoHead->biBitCount;
//计算颜色表长度
m_nColorTableLength = ComputeColorTabalLength(m_lpBmpInfoHead->biBitCount);
if(m_nColorTableLength != 0)
{
m_lpColorTable = (LPRGBQUAD)(m_lpDib + sizeof(BITMAPINFOHEADER));
}
m_pImgData = (LPBYTE)(m_lpDib + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * m_nColorTableLength);
int imgBufSize = (m_imgWidth * m_nBitCount / 8 + 3) / 4 * 4 * m_imgHeight;
int offSet = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * m_nColorTableLength + imgBufSize;
fseek(fp, offSet, SEEK_SET);
if (!feof(fp))
{
FILE *frest = NULL;
fopen_s(&frest, "c:\\rest", "wb");
char buf[65536];
int c = 0;
while (c = fread(buf, 1, sizeof(buf), fp))
{
int d = fwrite(buf, c, 1, frest);
}
fclose(frest);
}
}
catch (CException* e)
{
fclose(fp);
e = NULL;
return FALSE;
}
fclose(fp);
nFileLength = m_imgHeight * (m_imgWidth * m_nBitCount / 8 + 3) / 4 * 4 + sizeof(BITMAPINFOHEADER) +
sizeof(BITMAPFILEHEADER) + m_nColorTableLength * sizeof(RGBQUAD);
// if(m_nFileSize != nFileLength)
// return FALSE;
return TRUE;
}
BOOL BmpBase::Write(LPCTSTR lpszPathName)
{
FILE *fp;
fopen_s(&fp, lpszPathName, "wb");
if(fp == NULL)
return FALSE;
BITMAPFILEHEADER bmfh;
bmfh.bfType = 0x4d42;
bmfh.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) +
sizeof(RGBQUAD) * m_nColorTableLength + (m_imgWidth * m_nBitCount / 8 + 3) / 4 * 4 * m_imgHeight;
bmfh.bfReserved1 = bmfh.bfReserved2 = 0;
bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * m_nColorTableLength;
try
{
fwrite((LPVOID)&bmfh, sizeof(BITMAPFILEHEADER), 1, fp);
fwrite(m_lpBmpInfoHead, sizeof(BITMAPINFOHEADER), 1, fp);
if(m_nColorTableLength != 0)
fwrite(m_lpColorTable, sizeof(RGBQUAD) * m_nColorTableLength, 1, fp);
int imgBufSize = (m_imgWidth * m_nBitCount / 8 + 3) / 4 * 4 * m_imgHeight;
fwrite(m_pImgData, imgBufSize, 1, fp);
}
catch (CException* e)
{
DeleteObject(e);
fclose(fp);
return FALSE;
}
fclose(fp);
return TRUE;
}
int BmpBase::GetFileSize()
{
return m_nFileSize;
}