设为首页 加入收藏

TOP

1.4.3 ?????????DIB???д?????
2013-10-07 00:21:05 来源: 作者: 【 】 浏览:69
Tags:1.4.3 DIB

1.4.3  DIB д

Windows е DIB λ chap1_4 λ 洢 ó chap1_1 е BMP д
MFC - ó У й д й

MFC ó chap1_4
chap1_4Doc.h м г m_pDib BMP DIB

 public:
unsigned char *m_pDib;// DIB
ж m_pDib г
 CChap1_4Doc::CChap1_4Doc()
{
m_pDib=NULL; //
}
CChap1_4Doc::~CChap1_4Doc()
{
if(m_pDib!=NULL)//
delete []m_pDib;
}
DIBλ OnOpenDocument() 1-15
 
1-15  OnOpenDocument()

BOOL CChap1_4Doc::OnOpenDocument(LPCTSTR lpszPathName) 
{
//
if(m_pDib!=NULL){
delete []m_pDib;
m_pDib=NULL;
}

//
CFile file;
if (!file.Open(lpszPathName, CFile::modeRead | CFile::shareDenyWrite))
return FALSE;

// λ
file.Seek(sizeof(BITMAPFILEHEADER), 0);

// DIB BITMAPFILEHEADER λ
// 棬 m_pDib
m_pDib=new BYTE[file.GetLength() -sizeof(BITMAPFILEHEADER)];
file.Read(m_pDib, file.GetLength() -sizeof(BITMAPFILEHEADER));

return TRUE;
}

ó BMP OnOpenDocument() DIB 滺 m_pDib BITMAPINFOHEADER λ С 仺 1-16 DIB

 
1-16  m_pDib 滺

п m_pDib λ λ BITMAPINFOHEADER λ m_pDib+sizeof(BITMAPINFOHEADER) λ λ m_pDib+sizeof(BITMAPINFOHEADER)+ С С λ BITMAPINFOHEADER е biBitCount BITMAPINFOHEADER λ 仺 DIB DIB κε

DIBλ CChap1_4View OnDraw()

 void CChap1_4View::OnDraw(CDC* pDC)
{
//
CChap1_4Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if(pDoc->m_pDib==NULL)
return;

// infoHead DIB е BITMAPINFOHEADER
BITMAPINFOHEADER *infoHead=(BITMAPINFOHEADER*)pDoc->m_pDib;

// DIB λ
int width=infoHead->biWidth;
int height=infoHead->biHeight;
int biBitCount=infoHead->biBitCount;

// 0
// pow(2,biBitCount)
int colorTableLng;
if(biBitCount!=24)
colorTableLng=pow(2,biBitCount);
else
colorTableLng=0;

// 壬hPalette
//hOldPal
HPALETTE hPalette=0, hOldPal;
if(colorTableLng!=0){

// pColorTable DIB
RGBQUAD *pColorTable=(RGBQUAD *)(pDoc->m_pDib+
sizeof(BITMAPINFOHEADER));

// LOGPALETTE
LPLOGPALETTE pLogPal = (LPLOGPALETTE)new char[2*sizeof(WORD)
+colorTableLng * sizeof(PALETTEENTRY)];
pLogPal->palVersion = 0x300;
pLogPal->palNumEntries =colorTableLng;
for(int i = 0; i < colorTableLng; i++) {
pLogPal->palPalEntry[i].peRed = pColorTable[i].rgbRed;
pLogPal->palPalEntry[i].peGreen =pColorTable[i].rgbGreen;
pLogPal->palPalEntry[i].peBlue = pColorTable[i].rgbBlue;
pLogPal->palPalEntry[i].peFlags = 0;
}

//
hPalette = ::CreatePalette(pLogPal);

//
hOldPal=::SelectPalette(pDC->GetSafeHdc(), hPalette, TRUE);

//
pDC->RealizePalette();

//
delete []pLogPal;
}

//DIB
pDC->SetStretchBltMode(COLORONCOLOR);

//pImgData DIB λ
unsigned char* pImgData=(unsigned char*)(pDoc->m_pDib+
sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD) * colorTableLng);

// DIB
::StretchDIBits(pDC->GetSafeHdc(), 0, 0, width, height,
0, 0,  width, height, pImgData,
(LPBITMAPINFO)(pDoc->m_pDib), DIB_RGB_COLORS, SRCCOPY);

//
if(hOldPal!=NULL)
::SelectPalette(pDC->GetSafeHdc(), hOldPal, TRUE);
}


DIB У DIB 岢 豸 С й 崴 鼮

 DIB 洢 OnSaveDocument() 1-17

 
1-17  OnSaveDocument()

BOOL CChap1_4Doc::OnSaveDocument(LPCTSTR lpszPathName) 
{
// DIB
if(!m_pDib)
return 0;
 //д          
CFile file;
if (!file.Open(lpszPathName, CFile::modeCreate
| CFile::modeReadWrite
| CFile::shareExclusive))
return FALSE;
 //  infoHead   DIB  BITMAPINFOHEADER  λ  
BITMAPINFOHEADER *infoHead=(BITMAPINFOHEADER*)m_pDib;
 //                    λ  
int width=infoHead->biWidth;
int height=infoHead->biHeight;
int biBitCount=infoHead->biBitCount;
 //                                0  
pow(2,biBitCount)
int colorTableLng;
if(biBitCount!=24)
colorTableLng=pow(2,biBitCount);
else
colorTableLng=0;
 //  дλ       
BITMAPFILEHEADER bmfh;
bmfh.bfType = 0x4d42;  // 'BM'
int nSizeHdr = sizeof(BITMAPINFOHEADER) +
sizeof(RGBQUAD) * colorTableLng;
bmfh.bfSize = 0;
bmfh.bfReserved1 = bmfh.bfReserved2 = 0;
bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) +
sizeof(BITMAPINFOHEADER) +
sizeof(RGBQUAD) * colorTableLng;
 //      д     
file.Write((LPVOID) &bmfh, sizeof(BITMAPFILEHEADER));
 //BITMAPINFOHEADER      д     
file.Write(infoHead,  sizeof(BITMAPINFOHEADER));
 //                  д     
if(colorTableLng!=0){
RGBQUAD *pColorTable=(RGBQUAD *)(m_pDib+
sizeof(BITMAPINFOHEADER));
file.Write(pColorTable, sizeof(RGBQUAD) * colorTableLng);
}
 //       λ       С
int imgBufSize=(width*biBitCount/8+3)/4*4*height;
 //  pImgData   DIBλ        λ  
unsigned char* pImgData=(unsigned char*)(m_pDib+
sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD) * colorTableLng);
 //λ     д     
file.Write(pImgData, imgBufSize);
 return 1;
}
ResourceView String Table е 1-18 .bmp
 
1-18 
DIBλ OnDataAccess () CChap1_4View ú 1/4 ó
 void CChap1_4View:: OnDataAccess () 
{
//
CChap1_4Doc* pDoc = GetDocument();

// DIB
if(pDoc->m_pDib==NULL)
return;

// infoHead DIB е BITMAPINFOHEADER
BITMAPINFOHEADER *infoHead=(BITMAPINFOHEADER*)pDoc->m_pDib;

// DIB λ
int width=infoHead->biWidth;
int height=infoHead->biHeight;
int biBitCount=infoHead->biBitCount;

// 4
int lineByte=(width*biBitCount/8+3)/4*4;

// 0
// pow(2,biBitCount)
int colorTableLng;
if(biBitCount!=24)
colorTableLng=pow(2,biBitCount);
else
colorTableLng=0;

// pImgData DIB λ λ
unsigned char* pImgData=(unsigned char*)(pDoc->m_pDib+
sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD) * colorTableLng);

// 1/4 ó
//
int i, j;
if(biBitCount==8){//
for(i=0;i<height/2;i++){
for(j=0;j<width/2;j++){
*(pImgData+i*lineByte+j)=0;
}
}
}
else{//
int k;
for(i=0;i<height/2;i++){
for(j=0;j<width/2;j++){
for(k=0;k<3;k++)// 0
*(pImgData+i*lineByte+j*3+k)=0;
}
}
}

//
Invalidate();
}

1-19 chap1_4 ó е 漰 1-19 a н 棬 1-19 b н
 
1-19  chap1_4 н
α TEL 010 68476606

       

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇1.4.5 使用ImgCenterDib进行图像.. 下一篇1.5 面向对象的图像处理算法实现

评论

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