基于C#实现乱码视频效果
作者:Csharp小记 发布时间:2022-01-25 14:29:56
标签:C#,乱码,视频
文章描述
这个效果可能很多人都在抖音看到过,即把一个短视频,转成数字、字母等乱码组成的形式进行播放。
开发环境
.NET Framework版本:4.5
开发工具
Visual Studio 2013
实现代码
private void btn_convert_Click(object sender, EventArgs e)
{
string framePath = Application.StartupPath + "\\temp";
if (Directory.Exists(framePath))
{
Directory.Delete(framePath, true);
}
Directory.CreateDirectory(framePath);
//string newFramePath = Application.StartupPath + "\\newTemp";
//if (Directory.Exists(newFramePath))
//{
// Directory.Delete(newFramePath, true);
//}
//Directory.CreateDirectory(newFramePath);
FFmpegUtil.Split(axWindowsMediaPlayer1.URL, framePath);
List<char> listChar = new List<char>();
for (char i = 'a'; i <= 'z'; i++)
{
listChar.Add(i);
}
for (char i = 'A'; i <= 'Z'; i++)
{
listChar.Add(i);
}
for (char i = '0'; i <= '9'; i++)
{
listChar.Add(i);
}
string[] imgUrls = Directory.GetFiles(framePath);
Bitmap img = null;
for (int u = 0; u < imgUrls.Length; u++)
{
img = (Bitmap)Image.FromFile(imgUrls[u]);
double threshold = ImageUtil.GetAverageThreshold(img);
ImageUtil.Threshold(img, threshold);
StringBuilder builder = new StringBuilder();
Random random = new Random();
for (int y = 0; y < img.Height; y += 16)
{
for (int x = 0; x < img.Width; x += 8)
{
if (ImageUtil.GetGrayValue(img.GetPixel(x, y)) < threshold)
{
builder.Append(listChar[random.Next(62)]);
}
else
{
builder.Append(" ");
}
}
builder.Append("\r\n");
}
File.WriteAllText(@"C:\Users\Zero\Desktop\a\b\" + u + ".txt", builder.ToString());
}
MessageBox.Show("转换完成");
}
private void btn_show_Click(object sender, EventArgs e)
{
new FormShow(@"C:\Users\Zero\Desktop\a\b\").Show();
}
private void FormShow_Load(object sender, EventArgs e)
{
List<string> list = Directory.GetFiles(_path, "*.txt").ToList();
if (list.Count == 0)
{
return;
}
list.Sort((a, b) =>
{
string reg = "[0-9]+";
int a_index = int.Parse(Regex.Match(a, reg).Value);
int b_index = int.Parse(Regex.Match(b, reg).Value);
return a_index.CompareTo(b_index);
});
richTextBox1.Text = File.ReadAllText(list[0]);
Width = richTextBox1.Lines.Max(s => s).Length * 5;
Height = richTextBox1.Lines.Length * 10;
Location = new Point(Location.X, 10);
new Task(async () =>
{
foreach (string str in list)
{
if (!this.IsDisposed)
{
this.BeginInvoke(new Action(() =>
{
richTextBox1.Text = File.ReadAllText(str);
}));
}
await Task.Delay(260);
}
}).Start();
}
实现效果
代码解析:实现原理是首先利用ffmpeg将视频分割成一帧帧的图片,然后将每张图片进行一个二值化处理,最后判断灰度值,大于阈值的情况下随便输入一个字符,否则就输入空格。这里是使用了字符串来记录了各个图片的生成情况,最后保存到一个个的记事本中去。
在展示页面中,只需要将文件夹中的记事本文档按照顺序排列并逐个读取显示即可。
来源:https://mp.weixin.qq.com/s/9i7sXVbunXE2y8omNJhs2w


猜你喜欢
- 双向顺序队列ArrayDeque和双向链式队列LinkedList,JDK已经包含,在此略。ArrayDeque包括顺序栈和顺序队列,Lin
- a)原理:每一趟从待排序的记录中选出最小的元素,顺序放在已排好序的序列最后,直到全部记录排序完毕。也就是:每一趟在n-i+1(i=1,2,…
- 默认配置默认配置比较低,打开稍大点的项目就很容易卡掉,所以最好扩大一下内存。IntelliJ IDEA的VM配置IntelliJ IDEA2
- 最近研究OpenCV想用java进行开发,因此研究了一下怎么在Eclipse中配置基于java的Opencv.第一步:先到OpenCV官网下
- 本文介绍了android APP登陆页面适配的实现,分享给大家,具体如下:先看效果图。登陆首页效果图原理为RootView增加监听事件,然后
- 比如要获取打开摄像头的应用程序名称,只需要在frameworks/base/core/android/hardware/Camera.jav
- 前言Google终于发布了一个和SQLite相关的库了。之前一直都是在SQLite、XUtils、greenDao、Realm这些数据库之间
- 在程序开发中,一个程序经常需要去调用其他的程序,C#中Process类正好提供了这样的功能。它提供对本地和远程进程的访问并使您能够启动和停止
- 前言传统的Restful API 存在诸多的问题,首先它无法控制返回的字段,前端也无法预判后端的返回结果,另外不同的返回结果对应不同的请求地
- 1.SpringCloud是什么以前的服务器就像是一个医院只有一个医生,什么病人都要让这个医生看,如果医生觉得太累,自我暴毙了,那整个医院都
- 一.Mybatis-Plus——sum聚合函数//总收益 Order order =new Orde
- java 中ArrayList与LinkedList性能比较今天看一框架的代码,看到有些 可以使用ArrayList的地方 使用的是 Lin
- 希尔排序是插入排序的一种,又称"缩小增量排序”,是插入排序算法的一种更高效的改进版本。希尔排序原理1.选定一个增长量h,按照增长量
- 重要属性1、scale: 小数点后的位数。如将1.234构建为BigDecimal,scale属性则为32、RoundingMode(对照数
- 奇怪的不等于(≠)最近,栈长用 IntelliJ IDEA 看源码时发现:咦~这是什么鬼?Java 不等于的写法不是一直都是 != 么?什么
- 一、编译步骤解压下载的GDAL源程序,并在命令行中切换到解压目录。tar -xzvf gdal-2.1.3.tar.gzcd gdal-2.
- 做项目时使用maven构建项目已经是现在的流行做法了。那么maven的作用是什么呢?maven中的几个常用的命令都有什么用?下面我们来看一下
- 什么是 terms set 查询?Terms set 查询根据匹配给定字段的精确术语的最少数量返回文档。terms set 查询与 term
- 1.非静态成员变量当成员变量为非静态成员变量且对当前类进行实例化时,将会产生死循环例子:public class ConstructorCl
- 本文实例为大家分享了Android悬浮窗菜单的具体代码,供大家参考,具体内容如下MainActivity.java代码:package si