第一个项目:字符画神器——全程制作历程

本文适用于:java入门程序员
**读本文你可以学到:
1、一个初级程序员是如何设计初级程序的。
2、字符画的设计原理。
3、ffmpeg的截取画面与图片合成视频的指令。**
4、简单的jar打包指令
正文:
最近刚学完j2se,非科班出生加上对数学方面的东西比较迟钝,学的很是一般,遗忘比较多,想着做点项目来巩固知识,学程序,实战往往是进步最快的。
设计程序的初衷是在bilibili弹幕网上面看到的字符画视频,感觉很是神奇,于是想着应该也不复杂,想着自己实现一下,而且为了体现一点价值,我打算是把字符画视频制作的过程全部封装,做出一个程序,让大家都可用,不再是一个神秘的领域。本文仅作理论性的阐述,不贴出详细程序(有需求联系我,无偿提供源码)。
程序最终是这样的:

很是简易,不过我也是刚学习程序,所以很满足了,至于为什么java程序是EXE格式,我用了exe4j进行了打包。
开始说过程了,不扯远了。首先要完成我的最终目标,以我的水平来说还是相当难的。不一口吃成个大胖子,我先从一张图片入手。图片转换字符画的流程其实很容易想到。遍历图片的每一个像素点得出相关的RGB值,再利用明暗度公式换算,注意JAVA的getRGB()方法得到的RGB不是我们所理解的那个,具体貌似多出了透明度的概念,我也不甚了解,后期找到资料我会再贴文写出。总之将这个RGB值&0XFFFFFF可以转换成只有红绿蓝组成的RGB值。之后利用亮度公式的转换可以设置几个区间,配上适当的字符,这样就完成了将图片字符画的流程。
以下是单张图片对比图:

      这个精度是相当高的,可以说一定意义上和原图差不了太多,而且是真的由字符组成,当时我是蛮有成就感的。至于有些人偏爱的简笔画类型的字符画。其实原理也不复杂,就是将有些区间的字符弄成空即可,空的越多,精度越低,如果有些朋友有这方面的需求,我可以在后期补上调整精度的功能。完成了图片部分,就该是GIF的实现,这个比视频要简单一点。但是,在这里我碰见了最大的一个难关,怎么让字符画动起来?我是怎么也想不到解决方案,网上搜索结果是使用一个叫TXTpalyer的播放器,但这个就和我的初衷远离了,使用了别人的程序的确可以让我实现字符画播放,但我就无法实现做出一个傻瓜式的字符画生成器了,无法让不懂电脑的人也能实现。如果在我的程序里放一个文档,上面写着:你先用我这个程序,然后去下一个播放器。这就太LOW!!我在写这个程序时的水平,处于学习了JAVA30天左右,基础不是太好,实现文本播放很是困难,于是我想了个其他法子,将TXT变成图片,图片的播放,那就太容易了!【这里对于想实现在记事本里播放的朋友,可以先用这个软件的GIF转换或者视频转换,转换完之后在逐帧库里会存放TXT每帧的转换文本,你们可以用这些文本搭配notepad player,实现B站上那些技术宅的文本播放。因为就我所知,目前网上管用方法是先对视频截取每帧,再用别的工具转换TXT,在这里我的程序对这两步做了集成】要转换成图片,对我还是很难,我对几何有天生的恐惧,导致我到编写这个软件才知道有ImageIO,根本不想去接触。起先,图片的转换我我的是就直接转换成图片,这引发了一系列问题的思考,怎么入手,这个生成的图片尺寸怎么自适应原来文本的大小?生成图片会不会太大了?怎么入手这个地方难倒我了,我是怎么也不知道,这里我在知乎上看到了一篇叫《诸葛字符骂死字符王朗....》的文章,讲述了他制作字符画视频的流程,这里我惭愧一下,因为我的最终实现效果依旧没有这篇文章中的效果好。总之,我是马上去向作者取经。


OPENCV,这又是对我一个完全陌生的东西,抱着年轻学东西学的快的念头,我马上去官网看,最后得到的结果是这玩意对JAVA的支持是相当的差,要用它得绕一大圈子。当时我就没辙了,遂放弃。随后凭借着这位作者的“在图片上写字”这句话点醒了我,这个实现不难,因为首先生成一个图片我可以做到,其次在图片上写字,这个也有相关的方法,于是我就去尝试,终于成功了!
效果图:

有点铅笔画的效果是不是?哈哈,我也当初没料想到有这种效果。
总之,实现了图片的生成。下一步摆在我面的坎是截取GIF每一帧,所幸JAVA对GIF的解析支持还是比较足的,我在GitHub上找到了两个类:GifDecoder与AnimatedGifEncoder,对应了解码和编码,很是好用,由于CSDN不能贴动图,我就不放出动态图了,这里将每一帧的截取放出:

我感觉很适用于那些学习动态图绘制的朋友学习。
在查看GIF图像查看效果时,我发现帧率慢到了惊人的程度,起先以为是帧率检测程序检测少了帧率,遂改成了原来的1/2,结果并没有显著的提升,我这是意识到问题并不出在这。看了下单帧图片的属性,平均高度与宽度都上万,一张图十几MB,这样合成的GIF也有几十MB,能快才怪。只能寻求的是对图片的压缩。压缩我是完全不会,最简单的改编码我试了完全没效果,我就放弃了,这一块我是打算找网上现成的,很快找到了一份,试了下每张图片减少了1/3左右,合成结果也算满意。但是在最后我还是换上了我写的程序,因为单纯减少容量满足不了视频合成的需求,20+W的码率,太高了怎么也播放不出来。我只得按需求来设计,就是按比例减少单帧图片的高宽,结果是原来10MB的图片,最后只有100多KB了,于是我直接换掉了原来的那个压缩方法。
打倒妖魔鬼怪一片,最后一个关口到了视频这一块,按理说这个难度提升比前面是几何级的提升,但是我不怕,因为有个工具叫做ffmpeg!!我也是网上查资料找到这个东西的,相当好用。用ffmpeg截取每一帧以及合成,再用一个ffmpeg的封装包JAVE来实现对视频码率等的分析,一点也没难度!(才怪)
由于可能压缩与像素的遍历算法太差,视频转换耗时是极为的长,对于3秒钟的视频,大概用三分钟才行,这个我也暂时无能为力,后期会做出改进。
全部流程大概是这样。
下面,放出一些比较实用的小知识:
1、关于RGB的16进制问题,有些颜色的十六进制是00开头,通常是偏蓝色系,这样的值在转String类型时会自动忽略,应手动添加上。黑色时#000000原理相似。

 2、ASCII字符并不是正方形的,而是一个大约高是宽的两倍的矩形,解决方式为用两个字符的字符串代替单个字符,防止变形问题。(关于这一点,我不知道字体不同会不会不一样)3、打包JAR时也许会出现没有权限访问的提示,这时请第一步看你安装jdk和jre没有,第二步看看你的指令对没对,第三步看你的外部包导入没有,一般问题都杵在这三点。出现找不到主类的问题,请新建文本文件,里面写Main-Class:空格XX回车,保存后再试一试。(XX代表主类)4、试用了JAR2exe与EXE4j,区别在于后者实现了真正地让用户一点就使用的效果。晨风君   2017/2/9

第一个项目:字符画神器——全程制作历程相关推荐

  1. 字符画君君C语言,20行代码制作字符画版小黄鸭表情包 | 文末送书抽奖结果

    点击上方"日常学python",选择"置顶公众号" 第一时间关注 Python 技术干货! 阅读文本大概需要 5 分钟. 前段时间,一只可爱的小黄鸭火起来了,据 ...

  2. 基于QT的【第一个项目】设计+所有组件配合使用+网络编程局域网通信+文件IO操作+登录界面和头像+多界面跳转+JSON数据解析+表情包制作

    基于QT的第一个项目+所有组件配合使用+网络编程局域网通信+文件IO操作+登录界面和头像+多界面跳转+JSON数据解析+表情包制作 第一阶段 网络编程局域网TCP/IP聊天QT实现 main.c ma ...

  3. python画鸟_菜鸟世界 -使用python制作一张字符画

    1.灰度图与字符画 黑白照片大家都不陌生,但黑白照片并不是只有黑白两种颜色,还有介于黑和白之间的颜色,这些颜色色深度从0到255,0是黑色,255是白色,也叫灰度值 制作一张字符画的原理就是先将一张图 ...

  4. 福利!Python制作动态字符画(附源码)

    字符画,一种由字母.标点.汉字或其他字符组成的图画.简单的字符画是利用字符的形状代替图画的线条来构成简单的人物.事物等形象,它一般由人工制作而成:复杂的字符画通常利用占用不同数量像素的字符代替图画上不 ...

  5. Python制作字符画(pillow,numpy的使用)

    Python制作字符画 简介:本文讲解,如何使用python制作字符画,这里使用的是pillow和numpy这两个python的库. 字符画: 简单的字符画是利用字符的形状代替图画的线条来构成简单的人 ...

  6. python制作字符画视频来啦~

    字符画是什么? 字符画是一系列字符的组合,我们可以把字符看作是比较大块的像素,一个字符能表现一种颜色,字符的种类越多,可以表现的颜色也越多,图片也会更有层次感. 如果我们想要手工绘制出字符画,首先要有 ...

  7. python画动态小黄鸭_20行代码制作字符画版小黄鸭表情包

    前段时间,一只可爱的小黄鸭火起来了,据说是抖音上一位黄衣小姐姐模仿小黄鸭的动作而走红.这只动作呆萌的小黄鸭表情包也跟着火起来了,小黄鸭表情包也由一只变成多只,颜色也变幻莫测.pk 哥的技术交流群前段时 ...

  8. python项目实战:最简单的图片转字符画

    2019独角兽企业重金招聘Python工程师标准>>> 前言 今天为大家一个基础的,且简单的Python图片转字符画的过程,python图像转字符画需要用到matplotlib.py ...

  9. python字符画太小_python小项目(-)图片转字符画

    # -*- coding: utf-8 -*- from PIL import Image codeLib = '''@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrj ...

最新文章

  1. 【SLAM建图和导航仿真实例】(三)- 使用RTAB-MAP进行SLAM建图和导航
  2. Cisco Nexus 1000V
  3. PHP实训笔记,【学习笔记19】实验吧 让我进去
  4. Object.keys() Object.values()
  5. 图像多分类——卷积神经网络
  6. BZOJ3884 上帝与集合的正确用法 【欧拉定理】
  7. VS Code 1.38 发布,官方图标存储库发布
  8. Go语言圣经 - 前言
  9. mysql中的表自增的id太大了,可以重新设置自增起始值
  10. 永磁同步电机弱磁控制建模仿真
  11. Gartner 2018新技术成熟度曲线(五大技术趋势)
  12. Canal 整合 canal-admin ,canal-adapter
  13. 在XP上安装‘陈桥五笔’
  14. android手机系统怎么刷机包,安卓手机系统怎么重装刷机
  15. 中科软测试面试题2019_中科软科技股份有限公司面试经验
  16. 虚拟机局域网拓扑图_Hyper-V虚拟机常用网络拓扑结构
  17. 164 東皐 李浚慶
  18. 上海音乐学院官宣首位 AI 虚拟歌手入学,已发布首支个人单曲
  19. 酷狗音乐盒2014 v7.5.8.5 官方免费版
  20. Python爬取素材网站的音频文件

热门文章

  1. 一台电脑同时连接多个相同的USB摄像头并根据USB口进行区分
  2. 【做题】CF1045(ABH)
  3. 这是我见过最牛的报表制作神器!比Excel强大20倍!
  4. python+opencv旋转图片并求旋转之后的特征点坐标
  5. Carbondata 1.4.0+Spark 2.2.1 On Yarn集成安装
  6. Python 请用sorted对上述列表按名字和分数排序
  7. 医共体HIS系统应该具有哪些特色功能
  8. 洛基亚android手机,诺基亚安卓手机有哪些?
  9. 相关-10. 万能近似定理(universal approximation theorem)
  10. 卡方线性趋势检验_统计学第七章 卡方检验【R语言实现】