TAG:
头文件: #pragma once #include #pragma comment(lib, "Vfw32.lib") class CAviFile { public: PAVIFILE m_pfile; AVIFILEINFO m_afi; PAVISTREAM m_pavi; DWORD m_dwWidth; // 图像宽度 DWORD m_dwHeight; // 图像高度 DWORD m_dwDataLen; // 数据长度 BYTE* m_pData; // 图像数据 public: CAviFile(void); ~CAviFile(void); // 打开AVI文件 HRESULT Open(LPCTSTR szFile); // 读取帧 HRESULT GetFrame(long lFrame); // 绘制帧 bool DrawFrame(CDC* pDC, int x, int y); }; 实现文件: #include "StdAfx.h" #include "AviFile.h" CAvifile::CAviFile(void) { m_pfile = NULL; m_pavi = NULL; m_pData = NULL; m_dwWidth = 0; m_dwHeight = 0; m_dwDataLen = 0; ZeroMemory(&m_afi, sizeof(AVIFILEINFO)); // 初始化AVI库 AVIFileInit(); } CAvifile::~CAviFile(void) { if (m_pfile) { AVIFileRelease(m_pfile); } if (m_pData) { delete[] m_pData; } // 释放AVI库 AVIFileExit(); } // 打开AVI文件 HRESULT CAvifile::Open(LPCTSTR szFile) { // 打开AVI文件 HRESULT hr = AVIFileOpen(&m_pfile, szFile, OF_READ, NULL); if (FAILED(hr)) { return hr; } // 获取AVI文件参数 hr = AVIFileInfo(m_pfile, &m_afi, sizeof(AVIFILEINFO)); if (FAILED(hr)) { return hr; } m_dwWidth = m_afi.dwWidth; m_dwHeight = m_afi.dwHeight; m_dwDataLen = m_afi.dwWidth * m_afi.dwHeight * 3; // 获取AVI流 hr = AVIFileGetStream(m_pfile, &m_pavi, streamtypeVIDEO, 0); if (FAILED(hr)) { return hr; } if (m_pData) { delete[] m_pData; } m_pData = (BYTE*) new char[m_dwDataLen]; ZeroMemory(m_pData, m_dwDataLen); return hr; } // 读取帧 HRESULT CAvifile::GetFrame(long lFrame) { return AVIStreamRead(m_pavi, lFrame, 1, m_pData, m_dwDataLen, NULL, NULL); } // 绘制帧 bool CAvifile::DrawFrame(CDC* pDC, int x, int y) { if (m_pData == NULL) { return false; } HDC dc = CreateCompatibleDC(NULL); HBITMAP hNewBitmap = CreateBitmap(m_dwWidth, m_dwHeight, 1, GetDeviceCaps(dc, BITSPIXEL), NULL); if (hNewBitmap != NULL) { // 位图信息 BITMAPINFO bmi; ZeroMemory(&bmi, sizeof(BITMAPINFO)); bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmi.bmiHeader.biWidth = m_dwWidth; bmi.bmiHeader.biHeight = m_dwHeight; bmi.bmiHeader.biPlanes = 1; bmi.bmiHeader.biBitCount = 24; bmi.bmiHeader.biSizeImage = m_dwWidth * m_dwHeight * 3; // 用颜色信息填充兼容位图 SetDIBits(dc, hNewBitmap, 0, m_dwHeight, (void*) m_pData, &bmi, DIB_RGB_COLORS); // 显示帧 HBITMAP hOldBitmap = (HBITMAP) SelectObject(dc, hNewBitmap); BitBlt(pDC->m_hDC, x, y, m_dwWidth, m_dwHeight, dc, 0, 0, SRCCOPY); SelectObject(dc, hOldBitmap); // 删除位图 DeleteObject(hNewBitmap); } DeleteDC(dc); return true; } (iwgh) |