c#实现视频转字符画

视频转字符画并在控制台播放:

在此需要用到FFmpeg,请自行下载

using System;
using System.Drawing;
using System.Text;
using System.IO;
using System.Threading;
using System.Diagnostics;

namespace RealVideo2Char
{
    class Program
    {

        private static string app_dir = System.AppDomain.CurrentDomain.BaseDirectory;
        private static string img_dir = "img";
        private static string txt_dir = "txt";

        private static void Main(string[] args)
        {
            Console.WriteLine("Input name of video/gif,use \"reload\" to play the already converted file");
            string vname = Console.ReadLine();

            if (vname == "reload")
            {
                if (!Play())
                {
                    Console.Write("Play Error");
                    return;
                }
                Console.ReadKey();
                return;
            }

            Console.WriteLine("Input Resolution of video/gif,  dafalut 800x450");
            string reso = Console.ReadLine();
            if (reso == "" || reso == null)
            {
                reso = "800x450";
            }

            Console.WriteLine("Input frame rate, default 10");
            string frame = Console.ReadLine();
            if (frame == "" || frame == null)
            {
                frame = "10";
            }

            // 如果文件夹存在则清空内容
            // 如果文件夹不存在则新建
            if (Directory.Exists(app_dir + img_dir))
            {
                DelectFile(app_dir + img_dir);
            }
            else
            {
                Directory.CreateDirectory(app_dir + img_dir);
            }
            if (Directory.Exists(app_dir + txt_dir))
            {
                DelectFile(app_dir + txt_dir);
            }
            else
            {
                Directory.CreateDirectory(app_dir + txt_dir);
            }

            Console.Write("Converting video to image...");
            Video2Pic(vname, reso, frame);

            if (!Pic2Char())
            {
                Console.Write("Pic2Char Error");
                return;
            }

            // 暂停5秒提示
            Console.Clear();
            for (int i = 3; i > 0; i--)
            {
                Console.Write("\rConversion over, play in {0} seconds", i);
                Thread.Sleep(1000);
            }
            if (!Play())
            {
                Console.Write("Play Error");
                return;
            }
            Console.ReadKey();
        }

        //视频转图片
        private static void Video2Pic(string VideoName, string reso, string frame)
        {
            Process p = new Process();//建立外部调用线程
            p.StartInfo.FileName = "ffmpeg.exe";
            p.StartInfo.Arguments = " -i " + VideoName + " -r " + frame + " -f image2 -s " + reso + " "+app_dir+"img/%d.jpg"; // 每秒帧数,分辨率
            // -i D:\个人\葫芦娃 -r 10 -f image2 -s 800x450 img/%d.jpg
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.CreateNoWindow = true;
            p.Start();
            p.WaitForExit();//阻塞等待进程结束
            p.Close();
            p.Dispose();
        }

        //图片转字符
        private static Boolean Pic2Char()
        {
            long len = 0;
            int fileNum = 0;
            DirectoryInfo di = new DirectoryInfo(app_dir + img_dir);
            foreach (FileInfo fi in di.GetFiles())
            {
                len += fi.Length;
            }
            fileNum += di.GetFiles().Length;
            if (fileNum == 0)
            {
                return false;
            }
            Console.Clear();
            for (int i = 0; i < fileNum; i++)
            {
                Console.Write("\r{0}%..Converting the no.{1} image to ASCII code...", ((i + 1) * 100 / fileNum), i + 1);
                try
                {
                    Bitmap bm = new Bitmap(Path.Combine(img_dir, string.Format("{0}.jpg", i + 1)));
                    StreamWriter sw = new StreamWriter(Path.Combine(txt_dir, string.Format("{0}.txt", i + 1)), false, Encoding.ASCII);
                    //StreamWriter sw = new StreamWriter(Path.Combine(txt_dir, string.Format("{0}.txt", 1)), true, Encoding.ASCII);
                    for (int j = 0; j < bm.Height; j += 8)
                    {
                        for (int k = 0; k < bm.Width; k += 5)
                        {
                            byte g = bm.GetPixel(k, j).G;

                            if (g < 80)
                            {
                                sw.Write(" ");
                            }
                            else if (g >= 75 && g < 100)
                            {
                                sw.Write("-");
                            }
                            else if (g >= 100 && g < 120)
                            {
                                sw.Write(":");
                            }
                            else if (g >= 120 && g < 150)
                            {
                                sw.Write("+");
                            }
                            else if (g >= 150 && g < 175)
                            {
                                sw.Write("=");
                            }
                            else if (g >= 175 && g < 200)
                            {
                                sw.Write("*");
                            }
                            else
                            {
                                sw.Write("#");
                            }
                        }
                        sw.Write("\r\n");
                    }
                    sw.Close();
                    bm.Dispose();
                }
                catch
                {
                    return false;
                }
            }
            return true;
        }

        //输出字符文件序列
        private static Boolean Play()
        {
            long len = 0;
            int fileNum = 0;
            DirectoryInfo di = new DirectoryInfo(app_dir + txt_dir);
            foreach (FileInfo fi in di.GetFiles())
            {
                len += fi.Length;
            }
            fileNum += di.GetFiles().Length;
            if (fileNum == 0)
            {
                return false;
            }
            try
            {
                for (int i = 0; i < fileNum; i++)
                {
                    string resourcePath = Path.Combine(txt_dir, string.Format("{0}.txt", i + 1));
                    StreamReader sr = new StreamReader(Path.Combine(txt_dir, string.Format("{0}.txt", i + 1)), Encoding.ASCII);
                    Console.SetCursorPosition(0, 0);//防抖动

                    while (!sr.EndOfStream)
                    {
                        Console.WriteLine(sr.ReadLine());
                    }
                    Thread.Sleep(100);
                    //Console.Clear();
                    sr.Close();
                }
            }
            catch
            {
                return false;
            }

            return true;
        }

        public static void DelectFile(string srcPath)
        {
            try
            {
                DirectoryInfo dir = new DirectoryInfo(srcPath);
                FileSystemInfo[] fileinfo = dir.GetFileSystemInfos();  //返回目录中所有文件和子目录
                foreach (FileSystemInfo i in fileinfo)
                {
                    if (i is DirectoryInfo)            //判断是否文件夹
                    {
                        DirectoryInfo subdir = new DirectoryInfo(i.FullName);
                        subdir.Delete(true);          //删除子目录和文件
                    }
                    else
                    {
                        File.Delete(i.FullName);      //删除指定文件
                    }
                }
            }
            catch (Exception e)
            {
                throw;
            }
        }
    }
}

 

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值