文章目录

  • 前言
  • 1.下载视频
  • 2.截图成帧
  • 3.用代码生成文档
  • 4.播放

前言

之前就一直很羡慕大佬能制作出用字符跑bad apple的项目,一直很想试试。最近突然想到了,于是动手自己实操了一番。
项目里的很多代码都是借鉴了大佬们的,也感谢很多大佬的博客讲的很详细。
主要借鉴了以下几个大佬的博客:

       https://blog.csdn.net/clauyiye/article/details/78995219?spm=1001.2014.3001.5501https://www.cnblogs.com/CodeMIRACLE/p/5508236.html

我的大部分操作是借鉴大佬的,有一些操作是找到了一些更快捷的方式替代了。
下面将介绍具体的操作:

1.下载视频

视频可以自备,如果不知道怎么下,可以点

https://www.bilibili.com/video/BV1xx411c79H?from=search&seid=6687738456694002600&spm_id_from=333.337.0.0

然后在www.后面加个i就可以跳转下载了,它会要求下个下载器,觉得麻烦的可以通过其他方式获得视频。

2.截图成帧

我看几个大佬推荐的是用OpenCV来将视频处理成一帧帧的图片的,我觉得太麻烦了,安装个OpenCV就花了我许多时间,还不会用。另一个大佬用的是kmplayer或者potplayer,potplayer我电脑上有,但我打开的时候要更新就想让它更新了,我担心截到的帧的格式不对,又去下了个格式工厂,发现里面直接就可以将图片截成帧。

我立刻就将视频导了进去,帧的间隔建议设为0.1s,如果太小了,截下来的会非常多,特别占空间,即使如此,我也截了两千多张,好像有1.2g,空间不足就别逞强了。
然后截好就存在一个新项目文档里,建议在项目文档里建个文件夹命名为p(为啥叫这个,因为代码里引用的是这个,为了有些同学看不懂代码又想自己实现一遍,你只要按步操作就行),如图所示

3.用代码生成文档

上代码!!!
下面代码,你需要改一些地方,具体看注释

#include <cstdio>#include <cstring>#include <stdint.h>#include <windows.h>using namespace std;int32_t width,height;RGBQUAD *pixels;bool OpenBitmap(char const *filename){FILE *file = fopen(filename, "rb");if (file){width=0;height=0;BITMAPFILEHEADER bf;BITMAPINFOHEADER bi;fread(&bf, sizeof(bf), 1, file);fread(&bi, sizeof(bi), 1, file);if(bi.biBitCount!=24)return false;if(bi.biCompression!=BI_RGB)return false;width=bi.biWidth;height=bi.biHeight;pixels=new RGBQUAD[width*height];uint32_t rowSize = (bi.biBitCount * width + 31) / 32 * 4;uint8_t *line = new uint8_t[rowSize];for (int y = 0; y < height; y++){fread(line, rowSize, 1, file);for (int x = 0; x < width; x++){uint8_t *color = line + x * 3;RGBQUAD *pixel = &pixels[(height-y-1) * width+x];pixel->rgbBlue  = color[0];pixel->rgbGreen = color[1];pixel->rgbRed   = color[2];}}delete[] line;fclose(file);return true;}return false;}RGBQUAD GetColor(int x, int y, int w, int h){int r = 0, g = 0, b = 0;for (int i = 0; i < w; i++){if (i + x >= width) continue;for (int j = 0; j < h; j++){if (j + y >= height) continue;RGBQUAD const& color = pixels[(y + j) * width + (x + i)];r += color.rgbRed;g += color.rgbGreen;b += color.rgbBlue;}}return RGBQUAD{r / (w * h), g / (w * h),b / (w * h)};}char ColorToCharacter(RGBQUAD const& color){int brightness = (color.rgbRed + color.rgbGreen + color.rgbBlue) / 3;static char const *characters = "Qdogc*;:-. ";int len = strlen(characters);int span = 0xFF / len;int cidx = brightness / span;if (cidx == len)cidx--;return characters[cidx];}void OutputAscii(const char* filename, int w, int h){FILE *file=fopen(filename,"a+");int x = width  / w;int y = height / h;for (int i = 0; i < height; i += y){for (int j = 0; j < width; j += x){RGBQUAD color = GetColor(j, i, x, y);fprintf(file, "%c", ColorToCharacter(color));}fprintf(file, "\n");}delete [] pixels;fclose(file);}int main(){char filename[1024];printf("转换中.....");for(int i=1;i<=2173;i++)//将这里的i改为你p文件夹下图片的数量{sprintf(filename,"p/image%d.bmp",i);//这里是读入图片,如果图片的命名不是image+数字,那就自己根据具体命名改下if(OpenBitmap(filename));OutputAscii("badapple.txt",width/6,height/12);//输出字符文档}printf("转换完成!");}

该程序的存放位置要和p文件夹在同一个文件夹下。

4.播放

接下来有了txt文档,我们就可以播放了

#include <cstdio>
#include <windows.h>
struct fps_limit {int previous_time;int tpf_limit;int tpf;fps_limit(int fps = 60) : previous_time(GetTickCount()), tpf(0) {limit_fps(fps);}void reset() {previous_time = GetTickCount(), tpf = 0;tpf_limit = 60;}void limit_fps(int fps) {tpf_limit = (int)(1000.0f / (float)fps);}void delay() {tpf = GetTickCount() - previous_time; if (tpf < tpf_limit)Sleep(tpf_limit - tpf - 1);previous_time = GetTickCount();}
};
int main()
{FILE* fp = fopen("badapple.txt", "r");char buf[2048];fps_limit fps(20);//画面刷新帧率,不同设备最适不同,需要慢慢试while (!feof(fp)){HANDLE hConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE); COORD pos;//定义光标起始点pos.X = 0;pos.Y = 10;SetConsoleCursorPosition(hConsoleOutput, pos);for (int i = 0; i<32; i++) //这里调整的是整个画面的刷新频率,具体啥值播放最流畅需要自己慢慢试{fgets(buf, 2048, fp);printf("%s", buf);}fps.delay();}return 0;
}

该程序也要和txt文档放在同一个文件夹下,播放时如果不流畅,需要自己慢慢挑最适的fps还有刷新频率。

整个程序,如果有人想要的话,可以私信我,我发给你。

另外,再次感谢大佬们的博客,让我能自己对着博客实现了这样一个有趣的项目。

bad apple项目试制相关推荐

  1. 【IOS】Firebase(Google、Facebook、Apple、Guest)登录,FCM,Apple In-App,Kakao

    写在开头 记录自己接入SDK的过程.请各位指正. 最好提前做的工作 工欲善其事,必先利其器. 1.Mac电脑因Xcode而内存越来越大 弄到一半突然提示我内存不足,而且xcode还越来越卡.也是醉了. ...

  2. linux mipi驱动分析_寒武纪社招内推数字IC设计、DSI驱动、软件架构、产品经理、芯片架构、工具链开发、深度学习、FAE工程师...

    点击上方蓝字关注我吧! 为什么内推更靠谱?内推是基于人脉关系链的推荐,其背后有一定的信用背书,靠谱的人推荐的人相对也会比较靠谱,所以企业一般职位都是从内部开始分享的,相较于自己海投简历,内推的效率和成 ...

  3. 岁月的剪影【五月世界末日】

    五月三十一日 放假第一天,下午找了同事游泳,还是老样子,不会浮,不过有点感觉了~ 游泳完看手机,老板找过我,又电话又短信. ---- 运动完,人都精神多了,晚上累.好睡. 五月三十日 今天周五~ 今天 ...

  4. 【 Git 操作 】

    廖雪峰大神 Git 教程 Git-flow 包教不包会 阮一峰-常用 Git 命令清单 1.Git 简介 1.1 Git 是什么 目前世界上最先进的分布式版本控制系统 1.2 版本控制 链接 1.3 ...

  5. 最新苹果服务器认证,Sign in with Apple-苹果登录(客户端和服务端)

    Sign in with Apple已经很久了,之前只是看了一堆的文章理论,今天就实实在在的操作了一次,为后面项目中使用埋下基础.这篇文章会从头到尾描述清楚从客户端到服务器如何一步步的实现苹果登录. ...

  6. 原厂对NPI安全稽核要求

    苹果的期望: 1.零丢失,零泄露: 2.未能保护Apple项目机密是对协议的违反并将导致调查.罚款.和或终止业务关系. NPI网络隔离-1 整个区隔包含:设计终端.应用.服务器. 网络:网络区隔.且接 ...

  7. 穿Burberry的苹果公司“女魔头”

    穿Burberry的苹果公司"女魔头" 张弘 中国企业家杂志 昨天 苹果零售部门高级副总裁,安吉拉·阿伦茨.来源:视觉中国 谁会成为苹果公司的新灵魂人物? 文 | <中国企业 ...

  8. 苹果供应链的安全稽核及解决方案

    苹果的稽核要求及期望: 1.零丢失.零泄漏: 2.未能保护Apple项目机密是对协议的违反并将导致调查.罚款.和或终止业务关系. 方案描述:与苹果系统深度整合的终端管理工具 装置管控聚焦iOS与mac ...

  9. 编程第一个Apple Watch程序创建项目

    编程第一个Apple Watch程序创建项目 2.4  编程第一个程序 本节将通过编写第一个程序,为开发者讲解如何添加Watch应用对象.运行程序.界面设计.编写代码等内容本文选自Apple Watc ...

最新文章

  1. Spring Cloud Alibaba 负载均衡:Ribbon 如何保证微服务的高可用
  2. 兰州办着眼大数据切实提升数据分析管理能力
  3. 打印机驱动程序属于计算机硬件吗,如何安装打印机驱动程序,详细教您如何给电脑安装打印机驱动程序...
  4. 暗网 tor溯源困难根因——用户的请求会在分布全球的主机随机跳转三次,最终才到达服务器,这就造成了溯源的极其困难...
  5. 对实施运维的一点心得体会
  6. 【转载】在Linux CentOS中安装VSCode用于C++学习,亲测可用
  7. VTK:可视化之CollisionDetection
  8. 以太坊智能合约Hello World示例程序
  9. 项目Beta冲刺(团队)第七天
  10. shell:概述、脚本编写、变量的简单基础
  11. 流程多节点调用同一张业务表单的锚点问题
  12. CentOS6.5 linux 逻辑卷管理 调整分区大小:/dev/mapper/VolGroup-lv_root 50G 47G 16M 100%
  13. 简单图片隐写术练习题
  14. latex制作中英文简历(含模板代码)
  15. 厦门大学计算机系录取分数线贵州,贵州省多少名可以进厦门大学?附厦门大学近三年录取分数线...
  16. 性能优化的终极目标-内存简析
  17. java broken pipe_java Broken pipe 几种原因
  18. 在做产品经理的实习收获(第一篇)
  19. linux 下的igv软件,IGV软件使用指南
  20. jQuery-简述篇

热门文章

  1. 英语作文万能句子计算机专业,英语作文万能句子(精选12篇)
  2. Vue:循环数据上下及其中间增加横线(非表格)
  3. vue项目设置浏览器标题title
  4. 最具时尚感的15个壁纸品牌
  5. Ubuntu14.04下配置SSH以支持远程putty登录
  6. python机器人编程——差速AGV机器、基于视觉和预测控制的循迹、自动行驶(下篇)
  7. 计算机截屏窗口快捷键,电脑截屏的快捷键是什么
  8. 2021-04-09 入职第三天工作总结
  9. python-shutil模块
  10. 发布动态网站需要额外安装哪些软件_专为Win10打造的一款免费开源动态壁纸软件,可与WallpaperEngine媲美!...