织梦CMS - 轻松建站从此开始!

罗索

从avi文件中提取图片,意在抛砖引玉。

罗索客 发布于 2006-04-12 04:02 点击:次 
头文件: #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_pDat
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)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/200604/6047.html]
本文出处: 作者:iwgh
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容