python和c#_利用Python和C#实现字符视频

简介

大家可能或多或少的看过那么几个字符视频,像Bad Apple控制台版,效果十分不错。其实,字符视频的原理十分简单,将视频的每一帧都转换为字符画,再连续播放就可以了。本文就来实现一个字符视频的制作工具和控制台播放器。

准备

我们使用Python(opencv、pillow)和C#

先确保安装了opencv和pillowpip install opencv-python

pip install pillow

处理视频

步骤利用OpenCV,将视频逐帧保存为图片

调整图片的分辨率以适合控制台播放,这里调整为64×48

将小图片通过灰度化转换为灰度图

取一个合适的临界值,将灰度图二值化,也就是0或1,得到字符画

将所有的字符画帧保存供播放器播放import cv2

import numpy as np

from PIL import Image

#高度48 宽度64

H = 48

W = 64

#总帧数

cnt = 0

print("Char video maker by Azure99\nPress Enter to continue")

input()

print("Reading video")

video = cv2.VideoCapture("video.flv")

while video.isOpened() :

print("img%d" % cnt)

r, img = video.read();

try :

gary = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

except :

break

cv2.imwrite("png\\%d.png" % cnt, img)

cnt += 1

videoData = open("video.txt", "w")

#逐帧转换为字符图

for i in range(cnt):

print("frame%d" % i)

#读入图片并修改大小, 再转换为灰度图

img = Image.open("png\\%d.png" % i, "r").resize((W, H)).convert("L")

for Y in range(H):

for X in range(W):

pixel = img.getpixel((X, Y))

#二值化

if pixel < 200:

videoData.write(" #")

else :

videoData.write(" ")

videoData.write("\n")

videoData.close()

print("All done!Now you can move video.txt to C# Player folder")

编写播放器

步骤读入所有的字符画数据

以48行(也就是图片高度)为帧临界点

逐帧输出

可以优化的地方在播放前全部读入数据,并以每48行为单位保存在数组中

输出一帧时不要清屏,而是将光标移到开头,重新输出using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.IO;

using System.Threading;

namespace Player

{

class Program

{

private const int HEIGHT = 48;//每帧高度

private static string[] frames;

static void Main(string[] args)

{

Console.WriteLine("\t\tReading video...\n\n");

ReadVideo();

Console.WriteLine("\t\tChar video player by Azure99\n\t\tPress any key to play");

Console.ReadKey();

PlayVideo();

}

private static void ReadVideo()

{

StreamReader sr = new StreamReader("video.txt", Encoding.Default);

List framesList = new List();

while (!sr.EndOfStream)

{

StringBuilder sb = new StringBuilder();

for(int i=0; i

{

sb.Append(sr.ReadLine() + "\n");

}

framesList.Add(sb.ToString());

}

frames = framesList.ToArray();

}

private static void PlayVideo()

{

Console.Clear();

for (int i = 0; i < frames.Length; i++)

{

// 不要清屏, 将光标移到0, 0

Console.CursorLeft = 0;

Console.CursorTop = 0;

Console.Write(frames[i]);

// 根据机器配置, 调整暂停时间

Thread.Sleep(30);

}

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值