📄 dib.cpp
字号:
//释放得到的与位图相关的设备
BOOL CDIB::ReleaseDC(CDC *pdc)
{
ASSERT(pdc != NULL);
if(pdc->IsKindOf(RUNTIME_CLASS(CDibDC))){
delete pdc;
return(TRUE);
}
return(FALSE);
}
#ifdef _DEBUG
void CDIB::Dump(CDumpContext& dc) const
{
CGdiObject::Dump(dc);
if (m_hObject == NULL)
return;
BITMAP bm;
VERIFY(GetObject(sizeof(bm), &bm));
dc << "bm.bmType = " << bm.bmType;
dc << "\nbm.bmHeight = " << bm.bmHeight;
dc << "\nbm.bmWidth = " << bm.bmWidth;
dc << "\nbm.bmWidthBytes = " << bm.bmWidthBytes;
dc << "\nbm.bmPlanes = " << bm.bmPlanes;
dc << "\nbm.bmBitsPixel = " << bm.bmBitsPixel;
dc << "\n";
}
#endif
//////////////////////////////////////////////////////////////////
//
// LoadBmp(LPCSTR filename)
//
// 完成功能:
// 读入图像文件
//
// 输入参数:
// 位图文件名 filename
//
// 返回参数:
// 是否成功(-1为不成功)
//
//////////////////////////////////////////////////////////////////
//读入图像文件
int CDIB::LoadBmp(LPCSTR filename)
{
//打开文件
CFile file(filename,CFile::modeRead|CFile::shareDenyNone);
WORD bfType;
DWORD bfSize;
//读入文件头
file.Read(&bfType,sizeof(WORD));
file.Read(&bfSize,sizeof(DWORD));
if(bfSize <= 0)
{
file.Close();
return -1;
}
//是否Bmp文件
if (bfType != (((WORD)'M'<<8) + 'B'))
{
file.Close();
return -1;
}
DWORD bfOffBits;
//找到位图数据起始偏移并读入
file.Seek(2*sizeof(WORD),CFile::current);
file.Read(&bfOffBits,sizeof(DWORD));
LPVOID DibBuf;
DibBuf = (LPVOID)new char[bfSize];
if(DibBuf == NULL)
{
file.Close();
return -1;
}
//读入位图数据
file.ReadHuge(DibBuf,bfSize);
file.Close();
LPBITMAPINFO pBMI;
int size = bfOffBits - 14;
pBMI = (LPBITMAPINFO)new char[sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD)];
//生成信息头
memcpy(pBMI,DibBuf,size);
LPVOID lpBits = (LPVOID)((LPSTR)DibBuf + size);
//创建位图
CreateDIBIndirect(pBMI, lpBits);
delete pBMI;
delete DibBuf;
return 1;
}
//////////////////////////////////////////////////////////////////
//
// GetColorUsed()
//
// 完成功能:
// 得到使用的颜色数
//
// 输入参数:
// 无
//
// 返回参数:
// 颜色数
//
//////////////////////////////////////////////////////////////////
//得到使用的颜色数
int CDIB::GetColorUsed()
{
LPBITMAPINFOHEADER pBMIH;
DIBSECTION DibSection;
GetDibSection(&DibSection);
pBMIH = &DibSection.dsBmih;
return pBMIH->biClrUsed;
}
//////////////////////////////////////////////////////////////////
//
// GetPalette()
//
// 完成功能:
// 得到使用的调色板
//
// 输入参数:
// 无
//
// 返回参数:
// 调色板指针,用完应释放
//
//////////////////////////////////////////////////////////////////
//得到使用的调色板
CPalette * CDibDC::GetPalette()
{
LOGPALETTE * pLogPal = (LOGPALETTE *)new char[sizeof(LOGPALETTE) +
256 * sizeof(PALETTEENTRY)];
pLogPal->palVersion = 0x300;
pLogPal->palNumEntries = 256;
HDC hdc = GetSafeHdc();
RGBQUAD pRGB[256];
::GetDIBColorTable(hdc, 0, 256,pRGB);
for(int i = 0 ; i < 256 ; i ++)
{
pLogPal->palPalEntry[i].peRed = pRGB[i].rgbRed;
pLogPal->palPalEntry[i].peGreen = pRGB[i].rgbGreen;
pLogPal->palPalEntry[i].peBlue = pRGB[i].rgbBlue;
pLogPal->palPalEntry[i].peFlags = 0;
}
CPalette * pPal = NULL;
pPal = new CPalette;
pPal->CreatePalette(pLogPal);
delete pLogPal;
return pPal;
}
//////////////////////////////////////////////////////////////////
//
// GetBitmapInfo(void)
//
// 完成功能:
// 得到位图信息
//
// 输入参数:
// 无
//
// 返回参数:
// 位图信息指针,用完应释放
//
//////////////////////////////////////////////////////////////////
//得到位图信息
LPBITMAPINFO CDIB::GetBitmapInfo(void)
{
DIBSECTION DibSection;
GetDibSection(&DibSection);
int nSize = DibSection.dsBmih.biClrUsed*sizeof(RGBQUAD) + sizeof(BITMAPINFOHEADER);
BYTE *pByte = new BYTE[nSize];
memcpy(pByte, &(DibSection.dsBmih), sizeof(BITMAPINFOHEADER));
CDC *pdc = GetDC();
::GetDIBColorTable(pdc->GetSafeHdc(), 0, DibSection.dsBmih.biClrUsed,
(RGBQUAD*)(pByte+sizeof(BITMAPINFOHEADER)));
ReleaseDC(pdc);
BITMAPINFO *pBMI = (BITMAPINFO*)pByte;
return(pBMI);
}
//////////////////////////////////////////////////////////////////
//
// SaveBmp(LPCSTR filename)
//
// 完成功能:
// 保存位图文件
//
// 输入参数:
// 文件名 filename
//
// 返回参数:
// 是否成功
//
//////////////////////////////////////////////////////////////////
//保存文件
int CDIB::SaveBmp(LPCSTR filename)
{
BITMAPFILEHEADER hdr;
//打开文件
CFile file(filename,CFile::modeWrite|CFile::modeCreate);
//文件头
hdr.bfType = ((WORD)'M'<<8) + 'B';
LPBITMAPINFO pbi = GetBitmapInfo();
PBITMAPINFOHEADER pbih = (PBITMAPINFOHEADER) pbi;
hdr.bfSize = (DWORD) (sizeof(BITMAPFILEHEADER) + pbih->biSize + pbih->biClrUsed * sizeof(RGBQUAD) + pbih->biSizeImage);
hdr.bfReserved1 = 0;
hdr.bfReserved2 = 0;
// Compute the offset to the array of color indices.
hdr.bfOffBits = (DWORD) sizeof(BITMAPFILEHEADER) + pbih->biSize + pbih->biClrUsed * sizeof (RGBQUAD);
//写入文件头
file.Write((LPVOID) &hdr, sizeof(BITMAPFILEHEADER));
//写入信息头
file.Write((LPVOID) pbih, sizeof(BITMAPINFOHEADER)
+ pbih->biClrUsed * sizeof (RGBQUAD));
// Copy the array of color indices into the .BMP file.
//写入数据
int nTotal = pbih->biSizeImage;
LPVOID lpBits = GetBits();
file.WriteHuge(lpBits, nTotal);
//关闭文件
file.Close();
delete pbi;
return 1;
}
void CDIB::Show(CWnd *pWnd)
{
HDC hdc=::GetDC(pWnd->m_hWnd);
HBITMAP bmp=HBITMAP(m_hObject);
HDC hdcmem=::CreateCompatibleDC(hdc);
::SelectObject(hdcmem,bmp);
::BitBlt(hdc,0,0,GetWidth(),GetHeight(),hdcmem,0,0,SRCCOPY);
::DeleteObject(bmp);
}
//////////////////////////////////////////////////////////////////
//
// CaptureDIB(CWnd * pWnd, const CRect& capRect)
//
// 完成功能:
// 捕捉窗口图象
//
// 输入参数:
// 窗口指针 pWnd
// 捕捉的大小 capRect
//
// 返回参数:
// 是否成功
//
//////////////////////////////////////////////////////////////////
//捕捉窗口图象
BOOL CDIB::CaptureDIB(CWnd * pWnd, const CRect& capRect)
{
BOOL ret = false;
if(pWnd == NULL)
return false;
CDC * pPlayDc = pWnd->GetDC();
if(pPlayDc == NULL)
return false;
CRect Rect;
if(capRect.IsRectEmpty())
pWnd->GetClientRect(Rect);
else
Rect = capRect;
//得到图像颜色数
UINT nBitCount = pPlayDc->GetDeviceCaps(BITSPIXEL);
//创建位图
if(CreateDIB(Rect.Width(), Rect.Height(), nBitCount))
{
CDC * pCopyDc = GetDC();
if(pCopyDc == NULL)
{
pWnd->ReleaseDC(pPlayDc);
return false;
}
pWnd->ShowWindow(SW_SHOW);
//捕捉
if(pCopyDc->BitBlt(0, 0, Rect.Width(), Rect.Height(), pPlayDc, 0, 0, SRCCOPY))
ret = true;
ReleaseDC(pCopyDc);
}
pWnd->ReleaseDC(pPlayDc);
return ret;
}
////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
//
// CDibDC
//
// 设备无关位图设备类(版本1.0)
//
// 完成功能:
// 与设备无关位图的相关联
//
// 版本所有: 罗隽,曾志
//
//////////////////////////////////////////////////////////////////////
IMPLEMENT_DYNAMIC(CDibDC, CDC);
CDibDC::CDibDC()
{
m_hOld = NULL;
}
CDibDC::~CDibDC()
{
if(m_hOld != NULL){
::SelectObject(GetSafeHdc(), m_hOld);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -