easyx图形库—–贴图技巧之连续贴图

  • Post author:
  • Post category:其他



先看作品:

QQ录屏20221220195006

看吧,是不是很炫!这一期我来教大家怎么去做这种视频效果。


目录


前言:


获取帧图的方法


介绍两种方法实现动图


1.数组


2.单循环链表


小结 :


前言:

我们都知道视频其实都是每一帧图片一张一张放出来的,其中间会有一段延时时间,当这个时间非常短的时候(比如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 版权协议,转载请附上原文出处链接和本声明。