VC6 图像和视频处理之一:保存JPG文件
前一阵接了个项目,使用电脑上的摄像头拍照,所以花了一些时间研究了Windows 的VFW函数,发现这个挺好玩的,网上资
料也很多。简单介绍一下:
(1)使用 capCreateCaptureWindow 来创建一个图像窗口
(2)使用capCaptureGetSetup获取设置,在获取到的设置的基础上,对参数进行修改,包括:
是否同时捕获音频
帧数
是否有时间限制
等等
再使用capCaptureSetSetup设置
(3)使用capPreviewScale、capPreview开始预览
(4)可以使用capFileSaveDIB保存为BMP
(5)可以使用capCaptureSequence开始视频采集,capCaptureAbort、capFileSaveAs结束预览并保存为AVI
(6)可以设置帧回调函数和视频流、音频流的回调函数(基于这些函数,可以做成网络视频和音频点对点的程序)
存在问题的地方:
1、这样的API只能保存为BMP,太大了
有两个解决办法,一是使用VFW的函数,设置位图的像素、品质,二是不使用VFW,直接从系统获取JPEG的编码器来
压缩,方法如下:
先获取JPEG的CLSID
int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{
UINT num = 0; // number of image encoders
UINT size = 0; // size of the image encoder array in bytes
ImageCodecInfo* pImageCodecInfo = NULL;
GetImageEncodersSize(&num,&size);
if(size == 0)
return -1; // Failure
pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
if(pImageCodecInfo == NULL)
return -1; // Failure
GetImageEncoders(num, size, pImageCodecInfo);
CString s1="";
CString s2="";
for(UINT kk = 0; kk < num; ++kk)
{
if( TRUE )
{
s1+="[";
s1+=pImageCodecInfo[kk].MimeType;
s1+="]";
BSTR bs;
StringFromCLSID(pImageCodecInfo[kk].Clsid,&bs);
CString str=(LPCTSTR)_bstr_t(bs);
s2+="[";
s2+=str;
s2+="]";
}
}
AfxMessageBox( s1 );
AfxMessageBox( s2 );
for(UINT j = 0; j < num; ++j)
{
if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
{
*pClsid = pImageCodecInfo[j].Clsid;
free(pImageCodecInfo);
return j; // Success
}
}
free(pImageCodecInfo);
return -1; // Failure
}
保存jpg
HWND hWnd = m_VFWImageProc.GetCapWindow();
HDC hdc = ::GetWindowDC(hWnd);
RECT rr;
::GetWindowRect( hWnd,&rr);
int x = rr.right-rr.left;// GetDeviceCaps(hdc, HORZRES);
int y = rr.bottom-rr.top;// GetDeviceCaps(hdc, VERTRES);
HBITMAP hbmp = ::CreateCompatibleBitmap(hdc, x, y), hold;
HDC hmemdc = ::CreateCompatibleDC(hdc);
hold = (HBITMAP)::SelectObject(hmemdc, hbmp);
BitBlt(hmemdc, 0, 0, x, y, hdc, 0, 0, SRCCOPY);
SelectObject(hmemdc, hold);
const unsigned short *pszFileName=L"e:\\new.jpg";//保存路径
int xs=x;//GetSystemMetrics(SM_CXSCREEN);
int ys=y;//GetSystemMetrics(SM_CYSCREEN);
Bitmap bit(xs, ys), bit2(hbmp, NULL);
Graphics g(&bit);
g.ScaleTransform((float)xs/x, (float)ys/y);
g.DrawImage(&bit2, 0, 0);
CLSID encoderClsid;
ULONG quality;
quality = 30;
EncoderParameters encoderParameters;
encoderParameters.Count = 1;
encoderParameters.Parameter[0].Guid = EncoderQuality;
encoderParameters.Parameter[0].Type = EncoderParameterValueTypeLong;
encoderParameters.Parameter[0].NumberOfValues = 1;
encoderParameters.Parameter[0].Value = &quality;
GetEncoderClsid(L"image/jpeg",&encoderClsid);
bit.Save(pszFileName, &encoderClsid, &encoderParameters);
::DeleteObject(hbmp);
::DeleteObject(hmemdc);
这样,保存图片的大小一下子发生了质的变化。BMP的要240k,而同样品质和清晰度的jpg,才不到10k。
- 浏览: 310317 次
- 性别:
- 来自: 北京
最新评论
-
sp42:
同感
Java/J2EE:这是一个概念横行满天飞的时代 -
Iwishyou:
所以新增ibatis这么流行. 做hibernate的团队应该 ...
最好的ORM应该这样 -
SpringJava:
...
程序员(码农)的转身之道之二:如何准备转型为项目经理 -
windshome:
谢谢大家的回复。这一篇故意这么写,也就是发一发牢骚。本来专业技 ...
项目团队的大问题:西游记团队中需要裁掉一人,如果是您,您会裁谁? -
kawin_zhao:
仔细看看,在困难面前唐僧,八戒,沙僧是不是都被困住!是不是?
项目团队的大问题:西游记团队中需要裁掉一人,如果是您,您会裁谁?
相关推荐
VC 基于VFW实现的视频捕捉程序实例,并可实现对视频捕捉文件的保存功能,窗口风格//CS_OWNDC | CS_VREDRAW | CS_HREDRAW;窗口背景色为浅灰色,自动枚举系统摄像头设备并显示列表对话框,可录相和保存视频文件,直到...
使用微软VFW进行视频开发的学习笔记,word格式,很全,应该对你有帮助。
VC+VFW双摄像头程序 VC+VFW双摄像头程序 VC+VFW双摄像头程序 说明一下: 程序打开的时候,会让你选择摄像头的,有两次选择,两次选一样的话就只能看到一下画面了,选不一样的才能同时看到两个画面
使用VC6.0的VFW获取摄像头图像预览,截图,录像,其中录像时,程序不能被打断,会死掉,还有别的解决办法,没有尝试。 其中预览功能使用的是VFW自己的 BOOL capPreview(hwnd,f),这个使用Graphics Device Interface ...
在vc++编程中使用VFW实现视频捕捉与保存
适用于初学者,vc使用vfw控制摄像头拍照,且程序运行后5秒钟自动拍照,已编译好,可以直接运行,凑够50个字
视频捕捉全教程_vc_vfw
许多关于视频的软件(如视频会议、可视电话等)开发都...由于VFW SDK只有VC和VB版,没有Delphi版,因此需要在Delphi中一一声明DLL中的各个函数和变量。文中详细介绍了如何利用VFW在Delphi中开发视频捕获程序的步骤。
资料详细介绍了VC环境下,使用VFW开发视频采集程序的过程,共视频软件开发人员使用
使用Vfw中的AVIFile相关函数 和 GDI的BitBlt实现屏幕录像 由于没有压缩, AVI文件会很大.
vc vfw视频编程实例集vc vfw视频编程实例集vc vfw视频编程实例集
VFW是Microsoft于1992年推出的数字...VFW主要由 AVICap.dll、MSVideo.dll、MCIAvi.drv、AVIFile.dll、vfw32.lib等库文件组成,这些库提供了相关视频、音频、AVI文件的函数,本节将介绍如何利用这些函数进行视频采集。
值得学习的VFW视频传输VC++代码 初学者可以看看 很实用
VC++读取AVI视频方便了操作,利用VC++,VFW函数进行了封装
基于VC6.0+VFW摄像头简单应用,在笔记本上调试通过,可以直接运行Release文件下的可执行文件,开始后点击Preview进行预览,可以拍照,录像。不过程序较为简单,功能不是很完善,适合入门。具体参考文件里的提示文档。
在Delphi中利用VFW技术和摄像头实现视频捕捉
使用微软提供的avi库进行网络视频聊天。 Vfw是微软提供的一个avi库。 源代码是VC6.0下的,书本讲的十分简练,也有很多错误。这个是使用VS2010重写的,其中加入了大量自己的理解注释,对于不了解如何进行网络视频开发...
基于VFW的视频采集,基于VC的对话框形式,可采集视频,保存文件,单帧图片采集。保存默认路径为C盘
通过使用SetWindowLong给创建的窗口添加过程函数,解惑鼠标双击消息,然后通过自定义的消息,实现过程函数与主窗口的通信,实现全屏显示。
用VFW实现采集摄像头数据,并保存为bmp和jpg图片。