65.9K
CodeProject 正在变化。 阅读更多。
Home

一键从图片文件生成 Avi

2017年12月24日

CPOL

7分钟阅读

viewsIcon

16408

downloadIcon

1277

小型的 Avi 演示性能的简单解决方案,从任何类型的图片文件生成

Sample Image - maximum width is 600 pixels

引言

在准备我的PowerPoint演示文稿时,我发现插入一些avi格式的演示可能很有用。唯一的问题是我当时没有将屏幕图像转换为avi的工具。一如既往,我开始在CodeProject上寻找幸福。一如既往,我很幸运地找到了Andy Bantly的文章《Easy AVI》。再次,代码很棒,想法也很棒,但演示文稿有点不足。因此,我敢于通过标准MFC过程,通过几次点击来改进此功能,使其更易于使用。

背景

我从Andy Bantly的文章《Easy AVI》中借用了EasyAvi.cpp代码。在上面的代码中,我只注释掉了不适合新MFC项目的一些部分。所有其他功能都已使用标准MFC Application Wizard通过CImage类处理各种图像来完成。

在开始构建提供的项目之前,强烈建议您先看一下附带的演示文稿,以便对预期的输出有所了解。

演示说明

AviFromImgDemo目录中的可执行文件AviFromImg.exe是使用MSVS-2010的工具在MSVS-2015 pro中构建的。因此,AviFromImg.exe即使对于Windows-XP也有效。只是如果您想在Windows-XP中运行,请不要忘记将mfc100.dllmfc100u.dllmsvcp100.dllmsvcr100.dll文件放入AviFromImgDemo目录(或..windows\system32目录)。

安排了一些菜单和一些特殊的快捷键,以演示AviFromImg项目的实现。

  • 文件菜单->添加图像(s) - 选择要添加到ListBox控件列表中的图像文件(s)
  • 文件菜单->插入图像(s) - 选择要插入到ListBox控件列表中的图像文件(s),插在所选项目之前
  • 文件菜单->删除图像(s) - 从ListBox控件列表删除所选文件(s)
  • 文件菜单->全部清除 - 从ListBox控件列表删除所有文件
  • 文件菜单->创建 AVI - 从ListBox控件列表中的所有文件创建avi文件(也称为确定按钮
  • 文件菜单->播放 - 播放最后创建的avi文件
  • ListBox控件 - 包含用于创建avi的图像的文件名列表
  • 确定按钮 - 从ListBox控件列表中的所有文件创建avi文件(也称为文件菜单->创建 AVI
  • 取消按钮 - 关闭对话框
  • 反向添加复选框 - 如果选中,则将ListBox控件列表中的文件以反向顺序添加到avi中
  • 每秒幻灯片编辑框 - 指定avi中每秒图像变化的数量
  • 进度控件 - 在创建过程中指定当前已接受到avi中的图像数量

工作顺序如下

  • 启动后,将显示根目录中默认AviImages路径下的文件名列表。如果需要,可以使用菜单命令添加图像(s)插入图像(s)删除图像(s)全部清除来编辑此列表。
  • 使用添加图像(s)插入图像(s)命令,将出现标准FileDialog Box。此FileDialog Box具有多选属性,因此您可以从任何地方添加和插入任何类型的图像文件到列表中(只需记住图像的大小必须大致相同,最好完全相同)。
  • 使用创建 AVI命令(或按下确定按钮),将出现用于保存的标准FileDialog Box。建议将根目录下的默认AviFiles路径用于保存。这不是强制性的,您可以以任何名称将avi文件保存在任何您喜欢的地方。创建完成后,将出现一个带有创建路径名的MessageBox。请注意,avi的图像尺寸将从列表中的第一个图像借用。avi中的所有其他图像都将通过复制左上角的矩形区域获得。
  • 最后一个创建的avi可以使用菜单->播放命令启动。

因此,如果您最初在根目录的默认AviImages文件夹中准备了所有必需的图像文件,只需启动程序,然后按确定按钮,您将在根目录的默认AviFiles路径中获得avi文件,只需一次点击。

构建说明

解决方案配置必须设置为 **Release**,平台设置为 **x86**。

提供的项目是使用MSVS-2010的工具通过MSVS-2015 pro开发的。因此,exe文件即使对于Windows-XP也有效。如果您不需要在Windows-XP中运行该应用程序,只需将工具更改为MSVS-2015即可。

默认编码属性为 UNICODE;尽管 MBCS 编码也可用,只需更改属性即可。

即使您是第一次使用MSVS,只需选择菜单调试->开始而不调试,程序AviFromImg.exe应该开始构建和工作。

项目源文件和数据存储

AviFromImgproj路径下的标准源代码是使用标准的MFC Application Wizard创建的。

  • AviFromImg.cpp - 定义了应用程序的标准类行为
  • AviFromImgDlg.cpp - 标准CDialogEx类的实现;消息处理过程由作者使用标准MFC Application Wizard过程创建
  • EasyAvy.cpp - 从文章"Easy AVI"(作者Andy Bantly)借用;我只注释掉了不适合新MFC项目的一些部分
  • AviFromImg.rcresource.h - 菜单、对话框、加速键资源由作者使用标准的Resource Wizard过程创建

根目录下的默认AviImages路径包含用于首次程序测试的示例图像,这些图像是我上一篇文章《50 OpenGL MFC Projects in One》中的课程“X4.UFO game”的屏幕截图。这不是强制性的,您可以根据需要更改此路径的内容,或准备其他目录来存储图像。

建议将创建的avi结果保存在根目录下的默认AviFiles路径中。这不是强制性的,您可以将avi文件以任何名称保存在您喜欢的地方。

代码解释

所有菜单快捷键命令都是使用标准的MFC AppWizard技术完成的。因此,我认为没有什么比标准教程中解释得更好了。只是提一下标准FileDialog Box中的多文件选择用法。

  void CAviFromImgDlg::OnFileOpenimage()
{
  CString strFilter;                    //filter for CFileDialog box;
  CSimpleArray<guid> aguidFileTypes;
  HRESULT hResult;                      //result status of filter creation 

  CImage img;                          //Standard Cimage object
  hResult = img.GetImporterFilterString(strFilter, aguidFileTypes, _T("All Images"));
  if (FAILED(hResult)) {               //if the filter creation failed then cancel this proc 
    CString fmt;
    fmt.Format(_T("Error %d\n%s"), hResult, _com_error(hResult).ErrorMessage());
    MessageBox(fmt, _T("Error:"), MB_OK | MB_ICONERROR);
    return;
  }//if(FAILED(hResult))

  //Standard CFileDialog Box:
  CFileDialog dlg(TRUE, _T("*"), _T("*.*"), OFN_FILEMUSTEXIST| OFN_ALLOWMULTISELECT, strFilter);

  dlg.m_ofn.nFilterIndex = 0; //m_nFilterLoad;
  CString fileName;                                       //The string to contain 
                                                          //the files selected 
  wchar_t* p = fileName.GetBuffer(FILE_LIST_BUFFER_SIZE); //Reserve the space 
                                                          //for files selected
  dlg.m_ofn.lpstrFile = p;                                //Reference to the string 
                                                          //in  CFileDialog Box
  dlg.m_ofn.nMaxFile = FILE_LIST_BUFFER_SIZE;//#define FILE_LIST_BUFFER_SIZE
                                             //((MAX_CFileDialog_FILE_COUNT*(MAX_PATH+1))+ 1)

  if (dlg.DoModal() != IDOK)                 //start  CFileDialog Box
    return;

  fileName.ReleaseBuffer();                  //Clear Buffer

  wchar_t* pBufEnd = p + FILE_LIST_BUFFER_SIZE - 2; //The end of the buffer in CFileDialog Box
  wchar_t* start = p;                               //The beginning of the buffer 
                                                    //in CFileDialog Box
  while ((p < pBufEnd) && (*p))                     //find string end
    p++;
  
  if (p > start)
  {
    m_imgDir = start; //Path to folder where files were selected
    p++;

    int fileCount = 1;                             //number of files selected                
    while ((p < pBufEnd) && (*p))                  //read next string
    {
      start = p;                                   //specify the string found as start
      while ((p < pBufEnd) && (*p))
        p++;
      if (p > start)
      {
        m_imgList.AddString(start);           //append the file selected in the list box
        //append the pathname of the file selected in the list box$
        m_imgArray.Add(m_imgDir + _T("\\") + CString(start));
      }
      p++;                                    //next letter in the buffer in CFileDialog Box  
      fileCount++;                            //number of files selected increased
    }
   if (fileCount == 1)  //Single selection
      {
         m_imgList.AddString(dlg.GetFileName());
         m_imgArray.Add(dlg.GetPathName());
      }
  }
  m_btnOk.EnableWindow(m_imgList.GetCount() > 1);  //Create avi permitted if at least two files
                                                   //presented in the list box   
}  </guid>

请注意,一次附加到m_listArray的文件路径名与附加到m_listBox的文件名相同。因此,可以创建由位于不同目录的任何类型的图像组成的avi

至于EasyAvi.cpp中的CAVI类,我认为最好参考文章《Easy AVI》的作者Andy Bantly

使用提供的项目开发您自己的应用程序

您可以采用这个项目,将其重命名为我之前在CodeProject上的文章《MFC Project from Existing Code in One Click》中的项目,然后根据需要组合和改进代码。

或者,您可以从该项目中选取EasyAvi.cpp文件,并通过菜单项目->现有项将其包含在您任何的图像处理项目中。

或者,您可以简单地使用提供的演示中的AviFromImg.exe来安排您的图像到一个avi文件中。使用avi的演示效果更好。

如果您引用了我的代码,将不胜感激。

兴趣点和致谢

当然,您可以使用普通的专业软件(如CorelDraw或其他照片处理软件)将收集的图像技术转换为avi。但所有这些复杂的程序都使用封闭的源代码。因此,您无法像您喜欢的那样进行一些技巧和效果。

如果您担心创建的avi文件太大,可以使用网络上提供的在线转换器。提供的下载演示MP4示例是我上一篇文章《50 OpenGL MFC Projects in One》中的课程“X5.Box Play”的示例。

非常感谢Andy Bantly的精彩工作。我的avi演示效果很好。此外,我的孙女也喜欢用简单的技术制作电影。

历史

  • 2017年12月28日:初始版本
© . All rights reserved.