//--------------------------------------------------------------------------// //--------------------------------------------------------------------------// void CAGSymImage::LoadDIB(const BITMAPINFOHEADER* pHdr, const BYTE* pBits) { Free(); if (pHdr->biCompression == BI_RGB && (pHdr->biBitCount == 1 || pHdr->biBitCount == 4 || pHdr->biBitCount == 8 || pHdr->biBitCount == 24)) { BITMAPINFOHEADER bi; bi = *pHdr; bi.biCompression = BI_RGB; if (!bi.biSizeImage) bi.biSizeImage = DibSizeImage(&bi); if (!bi.biClrUsed) bi.biClrUsed = DibNumColors(&bi); if (m_pDIB = (BITMAPINFOHEADER*)malloc(DibSize(&bi))) { *m_pDIB = bi; if (bi.biClrUsed) memcpy((void*)DibColors(m_pDIB), (void*)DibColors(pHdr), DibPaletteSize(pHdr)); BYTE* pNewBits = (BYTE*)DibPtr(m_pDIB); const BYTE* pSrcBits; if (pBits) pSrcBits = pBits; else pSrcBits = (BYTE*)(DibColors(pHdr) + bi.biClrUsed); memcpy(pNewBits, pSrcBits, bi.biSizeImage); } } }
/******************************Public*Routine******************************\ * VcdPlyerCaptureImage * \**************************************************************************/ BOOL VcdPlyerCaptureImage( LPCSTR szFile ) { if(pMpegMovie) { BYTE* lpCurrImage = NULL; if(pMpegMovie->GetCurrentImage(&lpCurrImage) == S_OK) { BITMAPFILEHEADER hdr; HFILE fh; OFSTRUCT of; DWORD dwSize; PDIB pdib = (PDIB)lpCurrImage; fh = OpenFile(szFile,&of,OF_CREATE|OF_READWRITE); if(fh == -1) return FALSE; dwSize = DibSize(pdib); hdr.bfType = BFT_BITMAP; hdr.bfSize = dwSize + sizeof(BITMAPFILEHEADER); hdr.bfReserved1 = 0; hdr.bfReserved2 = 0; hdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + pdib->biSize + DibPaletteSize(pdib); _lwrite(fh,(LPCSTR)(LPVOID)&hdr,sizeof(BITMAPFILEHEADER)); _hwrite(fh,(LPCSTR)(LPVOID)pdib,dwSize); _lclose(fh); CoTaskMemFree(lpCurrImage); TCHAR szText[128], szDir[MAX_PATH]; GetCurrentDirectory(MAX_PATH, szDir); wsprintf(szText, TEXT("Captured current image to %s\\%s."), szDir, szFile); MessageBox(hwndApp, szText, TEXT("Captured bitmap"), MB_OK); return TRUE; } } return FALSE; }
//--------------------------------------------------------------------------// //--------------------------------------------------------------------------// bool CAGSymImage::Write(CAGDocIO* pOutput) { if (!pOutput) return false; // should never happen bool bReturn = CAGSym::Write(pOutput); if (m_pDIB) { DWORD dwSize = DibSize(m_pDIB); pOutput->Write(&dwSize, sizeof(dwSize)); pOutput->Write(m_pDIB, dwSize); pOutput->Write(&m_DestRect, sizeof(m_DestRect)); } else { DWORD dwSize = 0; pOutput->Write(&dwSize, sizeof(dwSize)); } return bReturn; }