一键从图片文件生成 Avi






4.64/5 (11投票s)
小型的 Avi 演示性能的简单解决方案,
引言
在准备我的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.dll、mfc100u.dll、msvcp100.dll、msvcr100.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.rc和resource.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日:初始版本