easyx图形库-----贴图技巧之连续贴图

        先看作品:

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这么长的数组,所以用链表的话,每次加载一张图片就开辟一个内存空间,这样就不会浪费那么多的内存。

  • 9
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fitz&

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值