【輕鬆一刻】Java製做字符動畫

前言

今晚閒來無事,整理了一下電腦中塵封已久的舊代碼,看着那些年本身寫過的代碼,踩過的坑,頓時老淚縱橫。正當在感嘆之際,忽然發如今「馬克思」文件夾下出現了一個好玩的項目,那就是N年前剛學Java時寫的GIF轉字符動畫的小玩具,雖然是個小玩意,可是在當時能搞點東西出來仍是很是有成就感的。html

正文

效果展現

原圖,某兩年半練習生git

 

 

轉成字符動畫後的練習生github

 

 

實現原理

其實字符動畫的實現原理比較簡單,這裏咱們拋開GIF,直接拿一張靜態圖片來講明。
首先咱們要把原圖轉成灰度圖,這樣圖片中每一個像素就只存在亮度信息0-255。web

 

 

 

 

取顏色的RGB均值灰度後工具

 

 

 

接着咱們能夠定義須要使用的字符,每一個字符對應一段亮度範圍,好比 圖中的M,@,;等字符,接着咱們就能夠去遍歷替換圖片中的全部像素,慢慢的調試每一個字符對應像素的亮度範圍,調試到輸出的圖像輪轂清晰便可,這樣單張圖片的字符畫就已經成型了。下面關鍵代碼註釋。post

BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file)));
        int width = bi.getWidth();//原圖寬度
        int height = bi.getHeight();//原圖高度
        int minx = bi.getMinX();//BufferedImage 原圖 最小X座標
        int miny = bi.getMinY(); //BufferedImage 原圖 最小Y座標
        for (int i = miny; i < height; i += 8) {//遍歷圖片中的像素點,用字符判斷像素範圍來替換
            for (int j = minx; j < width; j += 8) {
                int pixel = bi.getRGB(j, i); // 下面三行代碼將一個數字轉換爲RGB數字
                int red = (pixel & 0xff0000) >> 16;
                int green = (pixel & 0xff00) >> 8;
                int blue = (pixel & 0xff);
                double gray = 0.299 * red + 0.578 * green + 0.114 * blue; //圖片變灰計算公式
                char c = toChar((int) gray); //根據計算出來的gray值返回不一樣字符
                bufferedWriter.write(c);
            }
            bufferedWriter.newLine();
        }
        //輸出圖片

 

若要讀取GIF,輸出GIF,咱們可使用一些開源的包,例如animated-gif,GifDecoder等,經過這些類咱們能夠讀取到gif的每一幀,而後咱們對每一幀的操做都跟上方的靜態圖操做是一致的。處理完每一幀以後再合成GIF輸出便可。(視頻同理)優化

因爲徹底本身處理的話,可能會有不少細節須要調整的地方,爲了方便,這裏推薦一個項目。Github地址:github.com/korhner/asc… 。使用方法:動畫

// initialize caches
AsciiImgCache smallFontCache = AsciiImgCache.create(new Font("Courier",Font.BOLD, 6));
// initialize ssimStrategy
BestCharacterFitStrategy ssimStrategy = new StructuralSimilarityFitStrategy();

String srcFilePath = "examples/xxx.gif";
String disFilePath = "examples/xxx.gif";
int delay = 100;//ms

GifToAsciiConvert asciiConvert = new GifToAsciiConvert(smallFontCache, ssimStrategy);

asciiConvert.convertGitToAscii(srcFilePath, disFilePath, delay,0);

 

只須要簡單的幾行,就能夠完成字符動畫的轉換,其原理跟咱們上面介紹的基本一致,有興趣的同窗能夠自行研究。url

結語

代碼除了用來工做,其實還能用在不少能讓咱們開心的地方,例如寫點小工具,小遊戲,幫本身或他人解決一些繁瑣的事情,這樣才能在工做多年後任然保持對代碼的那份初心,不至於被重複的工做磨滅了激情。spa

 


 

公衆號博文同步Github倉庫,有興趣的朋友能夠幫忙給個Star哦,碼字不易,感謝支持。

github.com/PeppaLittle…

推薦閱讀

 

如何優化代碼中大量的if/else,switch/case?

如何提升使用Java反射的效率?

Java日誌正確使用姿式

論JVM爆炸的幾種姿式及自救方法

有收穫的話,就點個贊吧

關注「深夜裏的程序猿」,分享最乾的乾貨

 

 

相關文章
相關標籤/搜索