精华内容
下载资源
问答
  • 加载文件夹中的图片进行序列帧播放
    2019-12-13 18:50:37

    using System.Collections;
    using System.Collections.Generic;
    using System.IO;
    using UnityEngine;
    using UnityEngine.UI;
    using DG;
    public class LoadImage : MonoBehaviour
    {
        public string imageUrl= @"E:\李晓军\赵建鹏\posePictures";
        private string[] dirs = new string[] { };// //获取文件夹下所有的图片路径  
        public static List<Texture2D> allTex2d = new List<Texture2D>(); // 储存获取到的图片  
        public static int pictureNumber = 0;//文件夹中图片的个数
        public Image image;
        private void OnEnable()
        {   
            if (allTex2d.Count == 0)
            {
                load();
            }
        }

        void Start()
        {
          StartCoroutine(pictureTrue());
        }

        /// <summary>
        /// 获取图片个数,并存储
        /// </summary>
        private void load()
        {
            List<string> filePaths = new List<string>();
            //格式类型大小写无所谓
            string imgtype = "*.BMP|*.jpg|*.GIF|*.PNG";
            string[] ImageType = imgtype.Split('|');
            int number = 0;//个数存储
            for (int i = 0; i < ImageType.Length; i++)
            {
                //获取文件夹下所有的图片路径  
                dirs = Directory.GetFiles(imageUrl, ImageType[i]);
           
                for (int j = 0; j < dirs.Length; j++)
                {
                    filePaths.Add(dirs[j]);
                }
                number += dirs.Length;//不同类型的图片累计增加
            }

            for (int i = 0; i < filePaths.Count; i++)
            {
                Texture2D tx = new Texture2D(100, 100);
                tx.LoadImage(getImageByte(filePaths[i]));
                allTex2d.Add(tx);
            }

            pictureNumber = number;//传递图片个数
            Debug.Log("图片的个数:" + pictureNumber);

        }

        /// <summary>  
        /// 根据图片路径返回图片的字节流byte[]  
        /// </summary>  
        /// <param name="imagePath">图片路径</param>  
        /// <returns>返回的字节流</returns>
        private static byte[] getImageByte(string imagePath)
        {
            FileStream files = new FileStream(imagePath, FileMode.Open);
            byte[] imgByte = new byte[files.Length];
            files.Read(imgByte, 0, imgByte.Length);
            files.Close();
            return imgByte;

        }

        /// <summary>
        /// 把图片实例化出来
        /// </summary>
        private IEnumerator pictureTrue()
        {
            while (true)
            {
                for (int i = 0; i < allTex2d.Count; i++)
                {
                    //image.GetComponent<Image>().sprite = null;
                    Sprite sprit = Sprite.Create(allTex2d[i], new Rect(0, 0, allTex2d[i].width, allTex2d[i].height), Vector2.zero);
                    image.GetComponent<Image>().sprite = sprit;
                    yield return new WaitForSeconds(0.1f);
                }
            }
        }
    }

     

    更多相关内容
  • 本插件为自制插件,方便快捷,类似AE的序列帧格式输出设置,可以将附着脚本的相机画面渲染出序列帧,同时提供数设置,文件夹选择,渲染图片大小设置,渲染中停止功能。
  • 我们知道在unity中播放序列帧动画有两种方式,第一种是利用Unity自带的animation组件来播放,我们只需要在工程目录中全选选中所有我们需要播放的图片,将其拖动到Hiercarchy上,Unity就会帮我们自动创建一个...

    我们知道在unity中播放序列帧动画有两种方式,第一种是利用Unity自带的animation组件来播放,我们只需要在工程目录中全选选中所有我们需要播放的图片,将其拖动到Hiercarchy上,Unity就会帮我们自动创建一个animation片段,我们就可以用animation组件来控制我们的动画,不过这种方式创建的图片Sprite Renderer类型的。第二种方式就是创建一个Image组件,利用代码创建一个sprite,写一段代码利用Update函数来逐帧替换Image的sprite来实现动画的播放。这种的话可能会麻烦点,不过自由度高一点,可根据自己的需求来进行编写代码控制
    在这里插入图片描述

    由于最近的项目中需要用到大量的序列帧动画以及逻辑处理,本来想用Unity自带的Animation组件来实现的,但由于甲方需求一再变更,需要处理的逻辑太多,为了方便修改和拓展,所以就根据自己项目的需求自定义了一个序列帧播放组件来辅助开发。先贴上图片看看效果,如下图就是这个ImageAnimation脚本组件,我们只需要创建一个Image,然后挂载上这个脚本,将需要播放的图片赋给脚本上的Sprite数组,根据自己需求可在编辑面板设定图片的循环播放方式、播放速度、以及是否自动播放,还可根据自己的需求添加回调函数。很方便。
      好了,废话不多说了,上代码,脚本开放出来了播放Play()、暂停Pause()、停止Stop()、重播Replay() 4个公共方法,以及一个回调函数,根据自己的需求直接调用这4个方法和回调来控制自己的图片播放控制就好。脚本不是很复杂,主要是希望给大家提供一种思路,在项目开发中可以根据自己的需求封装一些功能出来来辅助自己开发,以提高效率。这次分享就到这里了,大家有什么问题和意见都可以和我交流、探讨,一起学习进步。

    /***********************************
    *    Description:描述这是一个图片序列帧播放脚本,
    *    Mountpoint:挂载点将其挂载在Image组件上
    *    Date:2019.07.11
    *    Version:unity版本2017.2.0f3
    *    Author:LJF
    ***********************************/
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    using LjfLog;
    using UnityEngine.Events;
    
    namespace LJF
    {
        //规范命名、添加注释、合理封装、限制访问权限、异常处理    
        public class ImageAnimation : MonoBehaviour
        {
            public enum State
            {
                idle,
                playing,
                pause
            }
            public enum State1
            {
                once,
                loop
            }
           
            [Header("播放方式(循环、单次)")]//默认单次
            public State1 condition=State1.once;
            [Header("自动播放")]//默认不自动播放
            public bool Play_Awake = false;
            //播放状态(默认、播放中、暂停)
            private  State play_state;
            private Image manimg;
            [Header("每秒播放的帧数(整数)")]
            public float frame_number=30;
            [Header("sprite数组")]
            public Sprite[] sprit_arr;
            //回调事件
            public UnityEvent onCompleteEvent;
            private int index;
            private float tim;
            private float waittim;
            private bool isplay;
            void Awake()
            {
                manimg = GetComponent<Image>();
                tim = 0;
                index = 0;
                waittim = 1 / frame_number;
                play_state = State.idle;
                isplay = false;
                if (manimg == null)
                {
                    Debuger.LogWarning("Image为空,请添加Image组件!!!");
                    return;
                }
                if (sprit_arr.Length<1)
                {
                    Debuger.LogWarning("sprite数组为0,请给sprite数组添加元素!!!");
                }
                manimg.sprite = sprit_arr[0];
                if (Play_Awake)
                {
                    Play();
                }
            }
            void Update()
            {
                //测试
                if (Input.GetKeyDown(KeyCode.A))
                {
                    Play();
                }
                if (Input.GetKeyDown(KeyCode.S))
                {
                    Replay();
                }
                if (Input.GetKeyDown(KeyCode.D))
                {
                    Stop();
                }
                if (Input.GetKeyDown(KeyCode.P))
                {
                    Pause();
                }
                UpMove();
               
            }
    
            private void UpMove()
            {
                //单播
                if (condition == State1.once)
                {
                    if (play_state == State.idle && isplay)
                    {
                        play_state = State.playing;
                        index = 0;
                        tim = 0;
                    }
                    if (play_state == State.pause && isplay)
                    {
                        play_state = State.playing;
                        tim = 0;
                    }
                    if (play_state == State.playing && isplay)
                    {
                        tim += Time.deltaTime;
                        if (tim >= waittim)
                        {
                            tim = 0;
                            index++;
                            if (index >= sprit_arr.Length)
                            {
                                index = 0;
                                manimg.sprite = sprit_arr[index];
                                isplay = false;
                                play_state = State.idle;
                                //此处可添加结束回调函数
                                if (onCompleteEvent != null)
                                {
                                    onCompleteEvent.Invoke();
                                    return;
                                }
                            }
                            manimg.sprite = sprit_arr[index];
                        }
                    }
                }
                //循环播放
                if (condition == State1.loop)
                {
                    if (play_state == State.idle && isplay)
                    {
                        play_state = State.playing;
                        index = 0;
                        tim = 0;
                    }
                    if (play_state == State.pause && isplay)
                    {
                        play_state = State.playing;
                        tim = 0;
                    }
                    if (play_state == State.playing && isplay)
                    {
                        tim += Time.deltaTime;
                        if (tim >= waittim)
                        {
                            tim = 0;
                            index++;
                            if (index >= sprit_arr.Length)
                            {
                                index = 0;
                                //此处可添加结束回调函数
                            }
                            manimg.sprite = sprit_arr[index];
                        }
                    }
                }
            }
            /// <summary>
            /// 播放
            /// </summary>
            public void Play()
            {
                isplay = true;
            }
            /// <summary>
            /// 暂停
            /// </summary>
            public void Pause()
            {
                isplay = false;
                play_state = State.pause;
            }
            /// <summary>
            /// 停止
            /// </summary>
            public void Stop()
            {
                isplay = false;
                play_state = State.idle;
                index = 0;
                tim = 0;
                if (manimg == null)
                {
                    Debuger.LogWarning("Image为空,请赋值");
                    return;
                }
                manimg.sprite = sprit_arr[index];
            }
            /// <summary>
            /// 重播
            /// </summary>
            public void Replay()
            {
                isplay = true;
                play_state = State.playing;
                index = 0;
                tim = 0;
            }
    
        }
    }
    
    展开全文
  • 【Photoshop】合并一系列序列帧图片成序列帧大图

    万次阅读 热门讨论 2017-10-04 10:05:51
    在2D游戏中,序列帧图片的大图是很常见很常用的东西,他用于记录游戏主角的所有动作。比如上图,就是lf2中的一张序列帧大图。 其实大部分软件都不支持gif或者直接拉个视频进去这样,序列帧图片来完成游戏主角的动作...

    在2D游戏中,序列帧图片的大图是很常见很常用的东西,他用于记录游戏主角的所有动作。比如上图,就是lf2中的一张序列帧大图。

    其实大部分软件都不支持gif或者直接拉个视频进去这样,序列帧图片来完成游戏主角的动作表现这项技术一直很经典。所以我们需要学会利用Photoshop合并一系列序列帧图片成序列帧大图。

    一般用视频软件或者Gif处理软件导出来的帧系列图片是这样的:


    你不可能拿这多达100张图片,导入程序。一般在编程时候,图片的合并为一张序列帧大图。

    肯定不可能一张张自己慢慢拼,就算你有这个心思,你未必能拼到鳞次栉比,符合游戏批量切割的要求。

    无须什么工具,你只要用photoshop cc以上的版本即可完成序列帧大图的拼接。

    具体如下操作:

    通过“文件”->“自动”->"联系表II"打开序列帧大图的批处理。

    选择源文件夹,最终的序列帧大图的大小,序列帧中的缩览图排序方式。最好先批量修改缩略图分辨率的大小。具体可以参考《【Photoshop】批量修改图片分辨率》(点击打开链接)。


    序列帧大图的大小和缩览图的排序方式应该根据缩览图的数量来定。缩览图也就是序列帧中的每一帧的小图。你要算一下,帧的数量,比如我这里有53个帧图。那就取一个近似的2次幂,也就是64。预计进行8x8的点阵排列这些序列帧图片成序列帧大图。所以缩览图的列数与行数都应该修改8x8。


    比如我这里缩览图分辨率已经修改为32x32,因此这里的序列帧大图宽高,都应该修改为32x8=256。


    设置好按确定,等待photoshop处理完成即可。最终效果如下图所示。

    一张gif:


    就被我弄成这样,当然,原本256x216的gif给我弄成每一张都是32x32帧图失真太严重了,现在技术发展了,一帧图弄成256x256也行。32x32一张帧图是以前VC6时代的做法~


    展开全文
  • 【python脚本系列】png序列帧转化为gif 大家好,我是Lampard猿奋~~ 欢迎来到python脚本系列的博客,今天和大家分享一下使用python如何将序列帧转化为gif (一)环境搭建 为什么会有那么奇怪的做法呢?...

                                 【python脚本系列】png序列帧转化为gif

       

            大家好,我是Lampard猿奋~~

            欢迎来到python脚本系列的博客,今天和大家分享一下使用python如何将序列帧转化为gif

    (一)环境搭建

          为什么会有那么奇怪的做法呢?其实是在最近我接到了一个在游戏项目中录屏并导出gif的需求。cocos是没有gif导出功能的(好像unity也没有?),其只支持png,jpg格式的导出。因此这个需求就被拆分为录制序列帧+把序列帧转化成gif,引擎录取序列帧我们可以通过计时器加截图来实现,下面主要说说如何把序列帧转换为gif。

          python环境搭建我已经在上一篇文章那里提及,大家可以跳转过去配置一下:【gif录制png序列帧】

    (二)脚本实现

    (1)目录结构

          我这边新建了一个文件夹,里面有一个制作gif动画的脚本gifMaker.py,有一个子目录gifFrame是用来存gif的序列帧(当然这个都是可以在脚本随便改的,但是如果直接拿我的脚本用的话就得根据这样的目录结构了)

    (2)代码实现

          首先是记录gif和gif帧的路径,我们可以通过os.path.realpath(__file__)来获得脚本的完整路径,我们并不需要脚本的名字,所以还需要通过os.path.split来把路径和脚本名分割开来

          可以看到当分割之后就会返回一个列表,列表的第一项就是我们想要的gif路径了,然后帧的路径就可以GifPath + '\\gifFrame'获得(window平台下)

          首先写一个方法,用os.listdir方法把gifFrame里面所有的文件给保存在列表中。然后还需要对里面的文件进行排序,不然的话会出现10.png排在2.png之前这种bug,打印一下排序前和排序后的效果

          排序前:0,1,10。排序后:0,1,2

          最后就是利用序列帧来生成gif了,同样使用到的是save方法,其中介绍一下几个参数:

    • save_all:是否展示所有帧,false的话就只显示第一帧
    • append_images,除第一帧之外之后的帧

    • duration:每一帧的持续时间,单位是毫秒

    • loop:重复次数,loop==0时一直重复

          如果想了解更多的话就应该去看文档啦~~【pillow库文档传送门】

    (三)PyInstaller

          这是一个小工具,使用的策划或者QA可能并没有我们python2的环境,让他们也搭建一个那是非常不现实的。所以我们需要把python脚本编译成exe可执行文件。而这个步骤就需要用到PyInstaller模块,我们可以从官网去下载,也可以通过pip去install

          然后在该文件目录下打开cmd,然后输入以下语句就可以打包exe文件了

          生成的exe存放在PyInstaller的子目录dist下,我们需要把这个exe文件复制到python的位置上,不然它拿gif路径的时候就会出错了

          看看最后效果:

    以上是学习路上的一点思绪,欢迎大家评论指点~


    点赞,关注!!!

    展开全文
  • 【python实现视频解并保存文件夹】1、功能说明2、代码实现3、知识点补充① os.getcwd()② cv2.VideoCapture().get方法获取视频的相关参数③ cv2.VideoCapture().read()方法④ cv2.waitKey()方法Reference ...
  • 序列帧动画制作

    千次阅读 2020-10-16 11:01:36
    动画制作: 1 打开编辑器 2 新建项目,名称示例:playrun 3 创建动画,名称示例:playrun,帧率用来控制动画速度快慢,也可以右键修改 4 右键创建动作,名称示例playrun 5 右键添加(就是图片),重复操作,...
  • 【python脚本系列】gif录制png序列帧 大家好,我是Lampard猿奋~~ 欢迎来到python脚本系列的博客,今天和大家分享一下使用python将gif录制为png的序列帧 (一)环境搭建 (1)python环境搭建 python我...
  • 用Python实现序列帧播放器 程序思路 用PyQt5创建一个窗口 使用tkinter.messagebox和filedialog进行用户交互 使用Pygame播放序列帧动画 使用Opencv2无损合成序列帧 窗口设计 用Qt designer设计窗口,并用PyUIC转换...
  • 制作序列帧动画

    千次阅读 2019-11-06 10:25:32
    1、新建一个空白项目,并且把图片放到assets目录下的images文件夹 2、创建一个场景以及一个精灵 3、选中刚才创建的精灵,然后点击顶部的导航栏的面板-动画编辑器 4、这时候会提示说,要制作动画,需要先为当前...
  • unity 序列帧动画 UGUI GPU版

    千次阅读 2021-11-30 14:02:56
    之前的项目因序列帧数量量大,图片大,耗费不少的资源,想搞一版GPU版本的序列帧试试水,看看性能,初见成效,但是弊端也蛮明显,就是不能合并drawcall,不过还能凑合着用 流程大概就是把图片资源全部压进GPU,用...
  • python 合并序列图像生成动图(简易版)
  • 从网上找了一些游戏特效素材,其中包括很多批序列帧图集 一部分特效素材是所有子都拼在一张大图上的, 而另一部分是若干个单独的序列帧图片 这样使用起来极其不方便,需要把资源的形式统一。最终决定...
  • 导航一、导入资源二、创建节点三、使用序列帧创建动画四、使用骨骼动画 一、导入资源 动画资源放到resources/model文件夹下,没有则对应新建一个,当然,也可以是其他路径,代码做对应修改就行(下同); 二、创建...
  • [工具集]等比序列帧图片切割工具

    千次阅读 2019-02-13 14:52:45
    快速对图片进行等比裁剪,导出分类好的文件夹. 工具基于Qt编写,因为代码不知道放哪了,暂不支持批处理操作 效果: 下载: https://pan.baidu.com/s/1gvGvLVPABNuZ1tWuECE2bQ 提取码:ihdg ps: 提示缺少xxx.dll文件 ...
  • saveFrame()保存序列帧

    2021-01-17 17:54:51
    图像文件保存到草绘的文件夹中,可以通过从“草绘”菜单中选择“显示草图文件夹”来打开。 或者,可以使用绝对路径(在unix和linux上启动的东西,或windows上的驱动器号)将这些文件保存到计算机上的任何位置。 从主绘图...
  • unity工具IGamesTools批量生成动画

    热门讨论 2016-03-24 15:09:15
    可批量的将指定文件夹下的动画图片自动生成对应的资源文件(Animation,AnimationController,Prefabs) 详细介绍地址: http://blog.csdn.net/dingkun520wy/article/details/50971544
  • opencv 入门笔记九 文件夹读取图片序列并视频播放
  • MP4 转 YUV ffmpeg -i cf_video_1.mp4 cf_video_1.yuv ffmpeg -i v1080.mp4 -s 600x300 2.yuv ffmpeg将视频导出成多张图片... -r参数表示按照30的帧率提取。 output-是名字 05d表示顺序有5位数00001-99999 ...
  • png序列帧转换WebP动画

    万次阅读 2018-05-31 12:45:40
    最近项目要用webp格式展示动画(webp格式的优点在这我就不说了,baidu很多),由于UI同学无法给予我们支持,只能给我们png序列帧文件,所以接下来的事情需要开发自己转换,所有有了这篇的总结:进入正题 对于png 、...
  • 使用Python来调用ImageMagick,将文件夹内所有的图片作为序列帧合并为一个GIF。 我事先使用Blender渲染了一组图片(操作很简单, 可见《尝试在blender中渲染一个最简单的动画》) 1. 使用ImageMagick将序列帧生成...
  • 笔者从事于cv视觉深度的相关研究,在cv的单目视觉深度模型中,monodepth2有一个相对较好的深度效果,但是论文...由于我采集1920*1080单目帧序列作为数据集,按照模型默认batchsize=12往超算里面送的时候提示显存不够...
  • 在2D游戏中,序列帧图片的大图是很常见很常用的东西,他用于记录游戏主角的所有动作。比如上图,就是lf2中的一张序列帧大图。 其实大部分软件都不支持gif或者直接拉个视频进去这样,序列帧图片来完成游戏主角的动作...
  • cocos2d序列帧动画plist文件的创建
  • CocosCreator实现粒子特效播放序列帧动画 本文基于CocosCreator2.2.0,主要是通过修改粒子系统定制引擎实现粒子特效播放序列帧动画的效果。 对于粒子特效播放序列帧动画目前来将引擎是不支持的,不过引擎已经完成...
  • 如何将视频转换成视频(视频图像序列)+ 如何制作自己的视频跟踪数据集  这次想在网上备注的知识是如何将视频转换成视频序列(即一的图像)。有的时候大家或许希望从视频中得到其中的某一幅或者某几幅图像...
  • 想要用Matlab提取avi视频中的图像,并保存成jpg格式%read video and save every frame as .jpg%obj = VideoReader('D:\data\test_video_3\test_video_3.avi');obj = VideoReader('test_video_3.avi');vid = read...
  • 最近写一个H5要求序列帧动画比较多,但是却仅仅是作为装饰,而不对其进行操作,为了减小内存以及更好的性能选择了css动画+css精灵图的方式。1.找工具制作css精灵图。听说Win系统的css sprite很好用,可惜mac系统不行...
  • unity序列帧动画的粒子特效

    千次阅读 2017-10-15 21:05:43
    参考:http://www.unitymanual.com/thread-2993-1-1.html?_dsign=a97a2a84本篇教程为基础篇,针对U3D入门新手,讲解粒子系统播放序列图的一种实现方法,随着基础教程的知识点的慢慢积累,以后将逐步展开进阶篇,项目...
  • 最近的项目用SpriteRenderer+Animation的方式播放序列帧,我那项目序列帧很多,项目大小差不多40G。。。 unity编辑器里是可以正常播放没问题的,但打包出去后,发现一闪一闪的,什么玩意啊。。。然后搜索了一下文章...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,488
精华内容 3,395
关键字:

帧序列文件夹