`

VC中屏幕保存为JPG文件的方法和VFW的使用

阅读更多


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。





分享到:
评论

相关推荐

    VC VFW实现的视频捕捉与保存实例.rar

    VC 基于VFW实现的视频捕捉程序实例,并可实现对视频捕捉文件的保存功能,窗口风格//CS_OWNDC | CS_VREDRAW | CS_HREDRAW;窗口背景色为浅灰色,自动枚举系统摄像头设备并显示列表对话框,可录相和保存视频文件,直到...

    使用VC进行VFW视频捕获笔记

    本文是关于使用Microsoft Visual C++ (VC++) 和Video for Windows (VFW) API进行视频捕获的详细笔记。VFW是Windows操作系统提供的一种视频处理框架,它简化了视频捕获、处理和播放的过程。下面将深入探讨各个关键...

    使用VC6.0的VFW获取摄像头图像预览,截图,录像

    使用VC6.0的VFW获取摄像头图像预览,截图,录像,其中录像时,程序不能被打断,会死掉,还有别的解决办法,没有尝试。 其中预览功能使用的是VFW自己的 BOOL capPreview(hwnd,f),这个使用Graphics Device Interface ...

    VC使用vfw控制摄像头拍照的程序

    7. **保存图像**: 将读取的图像数据保存为文件,可以使用`bmp`、`jpg`等常见图像格式。可以调用`BitBlt`函数将数据写入位图文件,或者使用第三方库如CImg、OpenCV等进行更复杂的图像处理。 8. **关闭资源**: 最后,...

    VC(VFW).rar_VC VFW_vfw

    6. **保存视频数据**: 可以选择将捕获的视频数据保存为AVI文件,使用`AVIStreamWrite`函数将帧写入到已创建的AVI流中。 7. **关闭并释放资源**: 最后,记得使用`AVIStreamRelease`、`AVIFileRelease`等函数释放打开...

    使用VFW实现视频捕捉与保存

    使用VFW在VC++中实现视频捕捉与保存,涉及到枚举设备、创建捕获窗口、设置视频格式、实时捕获、保存文件以及关闭设备等一系列步骤。虽然VFW相比现代技术显得有些过时,但它仍能在不需复杂库的情况下快速实现基本的...

    vfw.rar_vc vfw_vfw_vfw 视频播放

    标题中的“vfw.rar_vc vfw_vfw_vfw 视频播放”暗示了这是一个关于使用VC++(Visual C++)编程语言,通过VFW(Video for Windows)库进行视频播放的项目或教程。VFW是微软开发的一个API,主要用于处理视频和音频数据...

    VC VFW视频传输

    此外,VFW虽然在早期Windows版本中广泛使用,但随着DirectShow和Media Foundation等更现代的API出现,VFW在新的开发项目中逐渐被替代。不过,对于学习基础的视频处理和传输原理,VFW仍然是一个很好的起点。 总之,...

    VC+VFW双摄像头程序

    VC+VFW双摄像头程序 VC+VFW双摄像头程序 VC+VFW双摄像头程序 说明一下: 程序打开的时候,会让你选择摄像头的,有两次选择,两次选一样的话就只能看到一下画面了,选不一样的才能同时看到两个画面

    在VC6.0中使用 VFW并响应鼠标双击实现全屏显示

    在VC6.0环境下,利用VFW(Video for Windows)库进行多媒体处理是常见的实践,尤其是在处理视频流和播放方面。VFW是Microsoft提供的一种早期的API,它为Windows应用程序提供了处理音频和视频数据的能力。在这个场景...

    vc6.0基于vfw的录像小程序

    录像文件通常以AVI格式保存,因为VFW支持AVI的编码和解码。 5. **事件处理**:为了响应用户的操作,如开始录像、停止录像,需要编写事件处理函数,这些函数会在用户点击按钮时被调用。 6. **错误处理**:VFW函数的...

    Vfw + GDI屏幕录像

    Vfw是一个早期的Windows API,它为视频捕获和播放提供了接口,而GDI则是Windows系统的核心图形库,用于处理图像和设备的图形输出。 首先,我们需要了解AVIFile。AVIFile是Vfw的一部分,提供了一组API来处理AVI...

    VC中利用VFW进行视频采集.doc

    VFW 包含多个库文件,如 AVICap.dll、MSVideo.dll、MCIAvi.drv、AVIFile.dll 和 vfw32.lib,这些库提供了处理视频、音频和AVI文件的函数,方便开发者进行视频采集和处理。 在VC++中利用VFW进行视频采集,主要涉及...

    在Delphi中利用VFW和摄像头实现视频捕捉

    在Delphi中使用VFW,首先需要包含相关的头文件,如`vfw32.lib`和`mmsystem.h`。在Delphi中,这些通常通过导入单元来实现,例如`Windows`和`MMSystem`单元。导入后,你就可以调用VFW的函数了。 视频捕捉的核心步骤...

    vc vfw视频编程实例集

    1. **视频捕获**:使用VFW,你可以创建一个捕获应用程序,这允许从视频源(如摄像头)获取实时帧,并将它们保存到磁盘或显示在屏幕上。捕获过程中,你可以控制帧率、分辨率和压缩格式。 2. **视频编码与解码**:VFW...

    VC6.0 VFW摄像头采集视频图像

    在本教程中,我们将深入探讨如何利用VC6.0结合Video for Windows (VFW) API来捕捉摄像头的视频图像。 **VFW API介绍** Video for Windows (VFW) 是微软提供的一组API接口,它允许程序员在Windows操作系统上处理...

    vc6屏幕捕获与录制源码

    要将屏幕捕获的帧序列保存为AVI文件,开发者需要理解AVI文件的结构,如索引块、数据流等,并使用如`avisynth`或者自定义AVI文件写入代码。 屏幕录制的关键在于高效的帧率管理和内存优化。每帧捕获后的图像数据需要...

    如何利用VFW在Delphi中开发视频捕获程序

    还可以通过对话框显示视频源、格式和压缩选项,创建、保存或加载调色板,以及将捕获的帧保存为DIB格式文件。 3. **实现过程** - **声明函数和类型**:在Delphi中,需要手动声明VFW DLL中的函数和类型,如`...

    VFW_CAP.rar_VFW c builder_VFW interface _Vfw cap

    这通常涉及调用`capGrabFrame`或`capGrabFrameNoStop`函数来抓取一帧图像,然后使用`capSaveSnapshot`将当前画面保存为图像文件,如BMP或JPEG。如果要录制视频,可能还需要利用`AVIFile`接口将连续的帧写入到AVI文件...

Global site tag (gtag.js) - Google Analytics