设为首页 加入收藏

TOP

1.4.4 面向对象的DIB的读写及访问——ImgCenterDib类(3)
2013-10-07 00:22:00 来源: 作者: 【 】 浏览:55
Tags:1.4.4 面向 对象 DIB 读写 访问 ImgCenterDib

1.4.4  面向对象的DIB的读写及访问——ImgCenterDib类(3)

6.DIB替换函数——ReplaceDib()

/****************************************
*******************************
* 函数名称:
*     ReplaceDib()
*
*函数参数:
*    CSize size-要替换的新图像尺寸
*    int nBitCount-每像素的位数
*    LPRGBQUAD lpColorTable-颜色表指针
*    unsigned char *pImgData-位图数据的指针
*返回值:
*    无
*
*说明:给定新图像的尺寸、每像素位数、颜色表及
位图数据等信息,将m_lpDib
*      所指向的现有的DIB替换成新的DIB
****************************************
*******************************/
void ImgCenterDib::ReplaceDib(CSize size, int nBitCount, 
LPRGBQUAD lpColorTable,unsigned char *pImgData)
{
//释放原DIB所占空间
Empty();
 //成员变量赋值
m_imgWidth=size.cx;
m_imgHeight=size.cy;
m_nBitCount=nBitCount;
 //计算颜色表的长度
m_nColorTableLength=ComputeColorTabalLength(nBitCount);
 //每行像素所占字节数,扩展成4的倍数
int lineByte=(m_imgWidth*nBitCount/8+3)/4*4;
 //位图数据的大小
int imgBufSize=m_imgHeight*lineByte;
 //为m_lpDib重新分配空间,以存放新的DIB
m_lpDib=new BYTE [sizeof(BITMAPINFOHEADER) +
sizeof(RGBQUAD) *
m_nColorTableLength+imgBufSize];
 //填写位图信息头BITMAPINFOHEADER结构
m_lpBmpInfoHead = (LPBITMAPINFOHEADER) m_lpDib;
m_lpBmpInfoHead->biSize = sizeof(BITMAPINFOHEADER);
m_lpBmpInfoHead->biWidth = m_imgWidth;
m_lpBmpInfoHead->biHeight = m_imgHeight;
m_lpBmpInfoHead->biPlanes = 1;
m_lpBmpInfoHead->biBitCount = m_nBitCount;
m_lpBmpInfoHead->biCompression = BI_RGB;
m_lpBmpInfoHead->biSizeImage = 0;
m_lpBmpInfoHead->biXPelsPerMeter = 0;
m_lpBmpInfoHead->biYPelsPerMeter = 0;
m_lpBmpInfoHead->biClrUsed = m_nColorTableLength;
m_lpBmpInfoHead->biClrImportant = m_nColorTableLength;
 //调色板置空
m_hPalette = NULL;
 //如果有颜色表,则将颜色表拷贝至新生成的DIB,
并创建逻辑调色板
if(m_nColorTableLength!=0){
m_lpColorTable=(LPRGBQUAD)(m_lpDib+sizeof
(BITMAPINFOHEADER));
memcpy(m_lpColorTable,lpColorTable,sizeof(RGBQUAD)
* m_nColorTableLength);
MakePalette();
}
 //m_pImgData指向DIB的位图数据起始位置
m_pImgData = (LPBYTE)m_lpDib+sizeof(BITMAPINFOHEADER)+
sizeof(RGBQUAD) * m_nColorTableLength;
 //将新位图数据拷贝至新的DIB中
memcpy(m_pImgData,pImgData,imgBufSize);
}

7.其他帮助性的函数

在以上函数中我们多次用到了ComputeColorTabalLength()、MakePalette()、Empty()等函数,它们都是DIB读写及显示中的中间函数,其代码实现如下:


 /****************************************
*******************************
* 函数名称:
*     ComputeColorTabalLength()
*
*函数参数:
*    int nBitCount-DIB每像素位数
*
*返回值:
*    颜色表的长度
*
*说明:给定每像素的位数,计算出DIB颜色表的长度,
颜色表长度为2的nBitCount
*      次幂,但是24位位图颜色表长度为0
***************************************
********************************/
int ImgCenterDib::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:
ASSERT(FALSE);
}
 ASSERT((colorTableLength >= 0) && (colorTableLength <= 256)); 
return colorTableLength;
}
/*****************************************
******************************
* 函数名称:
*     MakePalette()
*
*函数参数:
*    无
*
*返回值:
*    无
*
*说明:根据DIB的颜色表,创建一个逻辑调色板(m_hPalette),
该调色板在显示位图时
*      将被选进设备环境中,24位彩色图像无调色板
*********************************************
**************************/
void ImgCenterDib::MakePalette()
{
//如果颜色表长度为0,则不创建逻辑调色板
if(m_nColorTableLength == 0)
return;
 //删除旧的逻辑调色板对象
if(m_hPalette != NULL) ::DeleteObject(m_hPalette);
 //申请缓冲区,根据颜色表生成LOGPALETTE结构
LPLOGPALETTE pLogPal = (LPLOGPALETTE)
new char[2 * sizeof(WORD) +
m_nColorTableLength * sizeof(PALETTEENTRY)];
pLogPal->palVersion = 0x300;
pLogPal->palNumEntries = m_nColorTableLength;
LPRGBQUAD m_lpDibQuad = (LPRGBQUAD) m_lpColorTable;
for(int i = 0; i < m_nColorTableLength; i++) {
pLogPal->palPalEntry[i].peRed = m_lpDibQuad->rgbRed;
pLogPal->palPalEntry[i].peGreen = m_lpDibQuad->rgbGreen;
pLogPal->palPalEntry[i].peBlue = m_lpDibQuad->rgbBlue;
pLogPal->palPalEntry[i].peFlags = 0;
m_lpDibQuad++;
}
 //创建逻辑调色板
m_hPalette = ::CreatePalette(pLogPal);
 //释放缓冲区
delete pLogPal;
}
/**************************************
*********************************
* 函数名称:
*     Empty()
*
*函数参数:
*    无
*
*返回值:
*    无
*
*说明:清理空间
*****************************************
******************************/
void ImgCenterDib::Empty()
{
//释放m_lpDib所指向的缓冲区
if(m_lpDib != NULL) {
delete [] m_lpDib;
m_lpDib=NULL;
m_lpColorTable=NULL;
m_pImgData=NULL;
m_lpBmpInfoHead=NULL;
}
//释放逻辑调色板缓冲区
if(m_hPalette != NULL){
::DeleteObject(m_hPalette);
m_hPalette = NULL;
}
}
还有一个函数——GetDimensions(),该函数可以获
得DIB的尺寸,在对DIB的访问中经常用到,其代码实现如下:
/****************************************
*******************************
* 函数名称:
*     GetDimensions()
*
*函数参数:
*    无
*
*返回值:
*    图像的尺寸,用CSize类型表达
*
*说明:返回图像的宽和高
******************************************
*****************************/
CSize ImgCenterDib::GetDimensions()

if(m_lpDib == NULL) return CSize(0, 0);
return CSize(m_imgWidth, m_imgHeight);
}
【责任编辑:夏书 TEL:(010)68476606】

回书目   上一节   下一节

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇1.1.3 颜色表 下一篇1.4.4 面向对象的DIB的读写及访问..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: