基于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
0
投稿
猜你喜欢
- 一、常见问题所有的final修饰的字段都是编译期常量吗?如何理解private所修饰的方法是隐式的final?说说final类型的类如何拓展
- 使用开源项目JAVAE 进行视频格式转换JAVAE简介:JAVE (Java音频视频编码器)库是ffmpeg项目的Java包装器。开发人员可
- 1. 可空类型修饰符(?):引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空。例如:
- 本文实例为大家分享了Java实现图形化界面日历的具体代码,供大家参考,具体内容如下此程序主要功能实现了可以根据用户选择的年月日来定位日期,日
- 概述线程池的好处和使用本篇文章就不赘叙了,不了解的可以参考下面两篇文章:一文全貌了解线程池的正确使用姿势学习线程池原理从手写一个线程池开始那
- ZooKeeper 是一个典型的分布式数据一致性解决方案,分布式应用程序可以基于 ZooKeeper 实现诸如数据发布/订阅、负载均衡、分布
- 一、项目运行环境配置:Jdk1.8 + Tomcat8.5 + mysql + Eclispe(IntelliJ IDEA,Eclispe,
- java 出现Zipexception 异常的解决办法1 异常描述在从 SVN 检出项目并配置完成后,启动 Tomcat 服务器,报出如下错
- java io操作中通常采用BufferedReader,BufferedInputStream等带缓冲的IO类处理大文件,不过java n
- 单例模式用于保证在程序的运行期间某个类有且仅有一个实例。其优势在于尽可能解决系统资源。通过修改构造方法的访问权限就可以实现单例模式。代码如下
- 场景很多情况下,查单条记录也用通用查询接口,但是输入的条件却能确定唯一性。如果我们要确定list中只有一条记录,如下写法:// 记录不为空
- 一、Java并发是什么?用学术定义来说就是并发:同一时间段,多个任务都在执行 (单位时间内不一定同时执行);简单来说就是,同一个时间段,让计
- 介绍备忘录模式(Memento Pattern)是一种行为型设计模式,它允许在不破坏封装性的前提下,捕获并保存一个对象的内部状态,并在之后可
- 本文实例讲述了JavaMail实现邮件发送的方法。分享给大家供大家参考。具体如下:下载 activation.jar 和 mail.jar配
- 通过之前三篇关于Spring Boot异步任务实现的博文,我们分别学会了用@Async创建异步任务、为异步任务配置线程池、使用多个线程池隔离
- HashTable和HashMap区别第一,继承的父类不同。Hashtable继承自Dictionary类,而HashMap继承自Abstr
- 背景:最近需要做一个任务:C# PDF文件需要传输为JPG图片。一开始没有头绪,最后去github找到了现在我用的PdfiumViewer组
- 原文:CREATING SAMPLE DATA FOR C#作者:Bruno Sonnino译文:C#中使用Bogus创建模拟数据译者: L
- using System;using System.Collections.Generic;using System.Text;namesp
- 在《Android Handler之消息循环的深入解析》中谈到了Handler是用于操作线程内部的消息队列,所以Handler可以用来线程间