先看作品:
QQ录屏20221220195006
看吧,是不是很炫!这一期我来教大家怎么去做这种视频效果。
目录
前言:
我们都知道视频其实都是每一帧图片一张一张放出来的,其中间会有一段延时时间,当这个时间非常短的时候(比如0.05秒放一张图片),连续的放出图片来就会形成视频的效果。
获取帧图的方法
首先我们要有一个已有的视频,然后在格式工厂去导出帧图片。(这个格式工厂可以在网上直接找到,然后下载就行了)
导出的帧图片延时可以根据个人的喜好来设置,这里我是每隔0.07秒导出一帧图片。
当前目录,这里导出了331张图片
介绍两种方法实现动图
1.数组
#include<stdio.h>
#include<graphics.h>
#include<Windows.h>
int main()
{
initgraph(360, 640);
int i = 0;
IMAGE k[331]={0};//定义IMAGE数组
char a[200];
for (; i < 331; i++) {
sprintf(a, "D:\\图片ol\\6a668b39f9af85e3f003bade5009e5e3(1)\\Image%d.jpg", i + 1);
loadimage(&k[i], a, getwidth(), getheight());//加载图片
}
while (1)//进入死循环
{
for (int j = 0; j < 331; j++) {
putimage(0, 0, &k[j]);
Sleep(70);//延时0.07秒贴一张图片
}
}
}
2.单循环链表
#include<stdio.h>
#include<graphics.h>
#include<Windows.h>
struct a//定义一个结构体
{
IMAGE kk;//图片类型 数据域
struct a* next;//指针域
};
void background()
{
struct a* head, * tail, * p;
head = tail = NULL;
int i = 0;
char a[200];
//创建链表
while (i < 331)
{
p = new struct a();//对指针p分配一个内存并且对数据域进行初始化
sprintf(a, "D:\\图片ol\\6a668b39f9af85e3f003bade5009e5e3(1)\\Image%d.jpg", i + 1);
loadimage(&p->kk, a, getwidth(), getheight());
if (head == NULL)
head = p;
else
tail->next = p;
tail = p;
p->next = head;//把每次建立好的指针p->next指回head的位置,实现单循环链表
i++;
}
p = head;
while (p)
{
putimage(0, 0, &p->kk);
Sleep(70);//延时0.07秒贴一张图片
p = p->next;
}
}
int main()
{
initgraph(360, 640);
cleardevice();
background();
system("pause");//卡住界面,防止一闪而过
}
看到这里有人就会问为什么要用new类型去开辟内存,而不是用malloc类型去开辟内存呢?因为IMAGE类型进行使用之前是需要进行初始化的,new函数不仅可以去分配内存,而且还可以对里面的元素进行初始化,而malloc函数只有分配内存的功能,并不能对元素进行初始化,所以如果用malloc函数去分配空间的话就加载不了图片。如果想了解更多看看这个吧
http://t.csdn.cn/nryfS
小结 :
对比上面两种方法,我个人还是比较建议用链表来实现贴图,因为如果你想做一个长时间的视频的话,那么导出的帧图片会很多,如果用数组去贴图的话,那么你很难把握住要设置数量为多少的数组,你可能会直接一次性设置99999这么长的数组,所以用链表的话,每次加载一张图片就开辟一个内存空间,这样就不会浪费那么多的内存。
版权声明:本文为m0_73633088原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。