本文已获得作者授权,原文作者:rome753
原文链接:https://www.jianshu.com/p/8fd1f0f8a5f1
很早就看到过这种场景,用字符来展示图片甚至播放视频,可以说是黑客炫(zhuang)技(b)神器。当然有了一定的技术之后,就明白其实实现挺简单。
相机预览
首先是相机预览的实现,因为不是这里的重点,所以直接在Github上找到成熟的代码。
Google官方的Demo当然是最好的:
https://github.com/googlesamples/android-Camera2Basic
这个项目演示了Camera2 API的基本使用,并在一个TextureView上展示了相机实时画面。
转换算法一(RGB转换)
有了TextureView,就能通过getBitmap()方法拿到bitmap,接下来就是把bitmap转换成字符串,相关算法这里有一份:
https://github.com/idevelop/ascii-camera/blob/master/script/ascii.js
虽然是JavaScript的,但是简单看一下就知道原理:
把bitmap中像素点的RGB值转换成灰度
用一个字符数组表示不同的灰度,如ascii字符串" .,:;i1tfLCG08@",越往后表示灰度越高,也就是颜色越深。当然也可以中文" 一十大木本米菜数簇龍龘"。
采样像素点灰度转换成字符,每行成一个字符串,不同行用换行符连接成一个总的字符串,展示到TextView上。
算法 Utils.java:
1public class Utils {
2
3 public static void startConvert(final TextureView textureView, final TextView textView) {
4 Handler handler = new Handler(){
5 @Override
6 public void handleMessage(Message msg) {
7 if(textureView != null) {
8