1. 程式人生 > >抖音上很火的字元畫 Android 實現

抖音上很火的字元畫 Android 實現

抖音上炫程式碼的不少,有些真的讓人歎為觀止,作為一個androider,當我看到下面這段舞蹈的時候,終於忍不住了,想要通過android實現一樣的效果。

這麼好玩的東西,為啥就沒有大佬做呢,原因可能有兩個,一是真的難,二是出力不討好,難以達到最終效果,一番嘗試後,技術問題都解決了,但並沒有達到電腦端美感,手機螢幕還是太小了。


這是電腦端的靜態圖

這是手機端的

還有一個普通的頭像,做成ascii圖後,簡直美到窒息

下面開始分析程式碼,首先根據圖片畫素灰度轉為ascii字元,這在網上有現成的java程式碼,android上只需要改一點api就可以,程式碼如下。

public static Bitmap createAsciiPic(final String path, Context context) {
        final String base = "#8XOHLTI)i=+;:,.";// 字串由複雜到簡單
//        final String base = "#,.0123456789:;@ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";// 字串由複雜到簡單
        StringBuilder text = new StringBuilder();
        WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics dm = new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics(dm);
        int width = dm.widthPixels;
        int height = dm.heightPixels;
        Bitmap image = BitmapFactory.decodeFile(path);  //讀取圖片
        int width0 = image.getWidth();
        int height0 = image.getHeight();
        int width1, height1;
        int scale = 7;
        if (width0 <= width / scale) {
            width1 = width0;
            height1 = height0;
        } else {
            width1 = width / scale;
            height1 = width1 * height0 / width0;
        }
        image = scale(path, width1, height1);  //讀取圖片
        //輸出到指定檔案中
        for (int y = 0; y < image.getHeight(); y += 2) {
            for (int x = 0; x < image.getWidth(); x++) {
                final int pixel = image.getPixel(x, y);
                final int r = (pixel & 0xff0000) >> 16, g = (pixel & 0xff00) >> 8, b = pixel & 0xff;
                final float gray = 0.299f * r + 0.578f * g + 0.114f * b;
                final int index = Math.round(gray * (base.length() + 1) / 255);
                String s = index >= base.length() ? " " : String.valueOf(base.charAt(index));
                text.append(s);
            }
            text.append("\n");
        }
        return textAsBitmap(text, context);
    }

這樣處理完得到的ascii文字,但我們需要的是ascii圖片,那我們需要怎麼做呢,截圖?

請讀者思考10秒鐘,想想自己的解決方案。

我這裡通過TextPanit和StaticLayout實現的,也可以new一個TextView,寫入文字,然後把Textview的緩衝區轉換為圖片,但是這種StaticLayout的方式更底層,更有效,程式碼如下:

public static Bitmap textAsBitmap(StringBuilder text, Context context) {

        TextPaint textPaint = new TextPaint();
        textPaint.setColor(Color.BLACK);
        textPaint.setAntiAlias(true);
        textPaint.setTypeface(Typeface.MONOSPACE);
        textPaint.setTextSize(12);

        WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics dm = new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics(dm);
        int width = dm.widthPixels;         

        StaticLayout layout = new StaticLayout(text, textPaint, width,

       Layout.Alignment.ALIGN_CENTER, 1f, 0.0f, true);

        Bitmap bitmap = Bitmap.createBitmap(layout.getWidth() + 20,

                layout.getHeight() + 20, Bitmap.Config.ARGB_8888);

        Canvas canvas = new Canvas(bitmap);
        canvas.translate(10, 10);
        canvas.drawColor(Color.WHITE);
        layout.draw(canvas);

        Log.d("textAsBitmap",

                String.format("1:%d %d", layout.getWidth(), layout.getHeight()));

        return bitmap;

    }

相對於電腦端有無邊無際的txt編輯框,android裡text是有字數限制的,所以原始圖片如果畫素過多的話就要進行尺寸壓縮。

而且textPaint的這個設定特別重要textPaint.setTypeface(Typeface.MONOSPACE);字型對效果的影響太大了,失之毫厘謬以千里,這是一個大坑,說多了都是時間。

我在專案裡集成了一個圖片選擇庫,可以直接把拍的照片轉化為ascii圖,碰到一個問題就是拍照圖片拿到後都會自動旋轉90度,很是困惑,雖然找到了處理方法,但系統為啥要作旋轉處理,還請知道的大神告知原因。

處理程式碼如下:

public static String amendRotatePhoto(String originpath, Context context) {

    // 取得圖片旋轉角度
    int angle = readPictureDegree(originpath);

    // 把原圖壓縮後得到Bitmap物件
    if (angle != 0) {
        Bitmap bmp = getCompressPhoto(originpath);
        Bitmap bitmap = rotaingImageView(angle, bmp);
        return savePhotoToSD(bitmap, context);
    } else {
        return originpath;
    }
}

用到的方法:

public static int readPictureDegree(String path) {
    int degree = 0;
    try {
        ExifInterface exifInterface = new ExifInterface(path);
        int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
        switch (orientation) {
            case ExifInterface.ORIENTATION_ROTATE_90:
                degree = 90;
                break;
            case ExifInterface.ORIENTATION_ROTATE_180:
                degree = 180;
                break;
            case ExifInterface.ORIENTATION_ROTATE_270:
                degree = 270;
                break;
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    return degree;
}

public static Bitmap rotaingImageView(int angle, Bitmap bitmap) {
    Bitmap returnBm = null;
    // 根據旋轉角度,生成旋轉矩陣
    Matrix matrix = new Matrix();
    matrix.postRotate(angle);
    try {
        // 將原始圖片按照旋轉矩陣進行旋轉,並得到新的圖片
        returnBm = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
    } catch (OutOfMemoryError e) {
    }
    if (returnBm == null) {
        returnBm = bitmap;
    }
    if (bitmap != returnBm) {
        bitmap.recycle();
    }
    return returnBm;
}

這些程式碼都在文末的專案裡。

按說拿到ascii圖後,想要把整個視訊轉換成ascii字元視訊就很簡單了。只要把視訊逐幀抽成圖片,圖片轉換後,再合成為視訊播放出來,但我視訊庫用的不多,希望有能力的朋友可以幫助完成最後一步。


最後,也希望朋友們能把一些有趣的想法實踐到android專案中來,讓搬磚之餘,有更多的樂趣。


github地址

https://github.com/meiniepan/Pic2Ascii

相關推薦

字元 Android 實現

抖音上炫程式碼的不少,有些真的讓人歎為觀止,作為一個androider,當我看到下面這段舞蹈的時候,終於忍不住了,想要通過android實現一樣的效果。 這麼好玩的東西,為啥就沒有大佬做呢,原因可能有兩個,一是真的難,二是出力不討好,難以達到最終效果,一番嘗試後

短視頻行業的原罪,為什麽都集中在爆發了?

抖音最近的抖音,又被推到了風口浪尖之上。在和騰訊朋友圈、微博、UC、百度信息流等產品的輪番口水戰之中,抖音和頭條系產品自身的正當性開始受到了質疑。從被官媒和有關部門頻繁點名開始,到不斷湧現的因模仿抖音段子產生事故的社會新聞,再到最近疑因整容輟學被封殺的網紅溫婉。抖音似乎走上了負面消息比正面消息還多的“黑紅”之

手機怎麼錄製播放的視訊如何錄製

  我們在手機上經常會刷到一些非常好玩的抖音短視訊,想要將視訊分享給自己的好友與他們一同分享。可是如果直接儲存到手機中,分享給好友會有許可權,所以很多人就會把要分享的抖音是錄製下來然後再進行分享,這也不失為一個好方法,那怎麼將手機中的視訊錄製下來呢?其實很簡單下面小編便來分享具體的錄製方法給大家。

如何用Python抓的小姐姐

爬蟲的案例我們已講得太多。不過幾乎都是網頁爬蟲。即使有些手機才能訪問的網站,我們也可以通過 Chrome 開發者工具的手機模擬功能來訪問,以便於分析請求並抓取。(比如 3分鐘破譯朋友圈測試小遊戲 文章裡用的方法)但有些 App 根本就沒有提供網頁端,比如今年火得不行的抖音。(網上有些教程也是用網頁手機模擬的方

java編寫圖片轉文字的程式

看著有趣就花了點時間,找相關demo拼湊在一起了。邏輯是讀取圖片畫素,根據畫素RGB值區分深淺,然後再用文字替換,輸出成text的文件。最後改變字型到合適的大小。話不多說,直接貼主程式碼。為防伸手黨,各位添加個包,補個private的命名就好。/** * 讀取一張圖片的RGB

用vbs寫表白的小程式

寫這個只是想說明看似很難的東西其實並沒有想的那麼複雜 寫這個只需要你新建一個記事本(文字文件),然後寫程式碼,最後儲存的時候字尾名加上.vbs即可,非常簡單 直接複製進去即可(" "裡的中文是隨便寫的,每一句的 ' 後面的是註釋,可不寫) Dim Msg1,Msg2

熱門、精選的機制是什麼? 的推薦機制是什麼?

  什麼產品適合做抖音?   這個問題可以先從做抖音需要投入什麼來說。有些達人自己拍自己就能火,這是一個人的團隊。而我們投入了十幾個人,有專業的裝置、影棚、演員、策劃、設計。在這樣的投入下,我們的視訊總計播放量達到 5 億多,價效比還是很高的。   在捨得投

農民伯伯出的題,真的會難倒清華北大的高材生嗎?

今天是元旦放假第一天,想著多睡會,不想改論文了。賴床的時候刷了刷抖音,發現有很多視訊反覆出現這麼一個題目。聲稱是一道農民工出的題目,難倒了幾萬清華北大的高材生。 說實話,這些年來這種UC式的標題讓人很疲勞,標題反正是一個比一個誇張。我仔細看了看題目,分析了一下。題目如下所示。   &nbs

分享熱門技巧!史最全的短視訊漲粉、運營攻略!

  最近和朋友聊天,大家都不約而同的提到抖音這個神奇的物種,很多人都搞不懂抖音到底是個什麼東西,為什麼能這麼火?   抖音是一個關於美好的短視訊APP   不同於快手的獵奇和稍微低俗的流量,抖音是一個記錄“美好”的產品,美好是什麼?每個人都想成為想象中的美好

喜歡面的音樂怎麼辦?用Python爬取音樂並分類放置資料夾

最近小編也在刷著抖音,上面的小哥哥、小姐姐各個都是人才,小編超喜歡裡面的 歌也挺好聽的,小編就打算把抖音上面歌曲都下載並且分類,把自己的喜歡的歌換成手機鈴聲,那麼抖音上面都有那些好聽的歌呢,比如: 《最美的期待》 周筆暢 《那個人》 周延英 《Panama》 Matteo 《病變

Python機器人,論如何在找到漂亮小姐姐?

最近沉迷於抖音無法自拔,常常花好幾個小時在抖音漂亮小姐姐身上。 為了高效、直接地找到漂亮小姐姐,我用 Python + ADB 做了一個 Python 抖音機器人 Douyin-Bot。 特性

Python 機器人,論如何在找到漂亮小姐姐

點選上方“程式人生”,選擇“置頂公眾號”第一時間關注程式猿(媛)身邊的故事圖片源自:The Gi

技術基礎 | 用JSON在釋出動態——使用Stargate即可輕鬆實現

Cassandra是世界上經受住最多實戰考驗的資料庫,通過其快速且易於使用的資料API,讓你的程式開發升級。 本文將介紹什麼是Stargate以及Stargate的最新進展,如果您想快速瀏覽相關程式碼和動手操作指南,不妨直接跳到本文的第四節,跟著我們一起在App上釋出動態、建立頻道並管理使用者吧。 &nbs

python gif轉字元實現

功能:該程式可將gif圖片匯入並轉換成字元組成的gif。 原理是現將匯入的gif圖片進行分割,逐張圖片獲取灰度並用字元代替,在所有圖片都處理完後重新生成gif圖片並匯出。 由兩個檔案組成,auth為主介面,fine為圖片處理程式。 最後一次測試的執行環境:python3.7 // pyc

揭秘雲控新玩法:實現自動化批量私信+精準評論引流

一鍵 發展 自動 多個 獨立 並且 活躍 擴大 為什麽 抖音群控引流系統是隨著抖音短視頻而逐漸發展火爆起來的一種營銷軟件,現在很多商家和個人都會通過抖音來引流,那麽如何更快速的擴大引流範圍,就是大家都在思考的問題了,而這時,抖音群控系統出現了,為什麽大家都會選擇抖音群控呢?

Android 進階】仿系列之翻頁下滑切換視訊(四)

大家好,我們又見面了。這是這個系列的第四篇,在這篇文章之前,建議可以先看下之前系列的文章,為了節省篇幅,之前詳細說過的地方,這裡就不再詳細描述了,下面是目錄: 【Android 進階】仿抖音系列之翻頁上下滑切換視訊(一) 【Android 進階】仿抖音系列之列表播放視訊

Android 進階】仿系列之翻頁下滑切換視訊(一)

最近公司在做個短視訊的專案,其中借鑑了很多抖音的設計,其中就有抖音的上下滑切換視訊。 【Android 進階】仿抖音系列之翻頁上下滑切換視訊(一) 【Android 進階】仿抖音系列之列表播放視訊(二) 【Android 進階】仿抖音系列之列表播放視訊(三)

android憤怒小鳥遊戲、自定義View、掌餐廳App、OpenGL自定義氣泡、電影濾鏡效果等原始碼

Android精選原始碼 精練的範圍選擇器,範圍和單位可以自定義 自定義View做的小鳥遊戲 android popwindow選擇商品規格顏色尺寸效果原始碼 實現Android帶有鋸齒背景的優惠樣式原始碼 android充值頁面效果原始碼 使用

的告白程式設計程式,C語言一樣也能做

最近抖音上火了一個由小夥伴自己製作的一個表白程式碼,很多小夥伴都在問這個表白程式碼是怎麼寫的?大家都知道是使用vbs實現的!雖說小編也承讓VBS實現更簡單,但是如果把列印心那個程式用起來,C語言是反而更妙一點。今天小編帶著大家用C語言實現下,順帶複習下C語言中的格式化

字元實現過程中的問題

程式碼連結 程式碼是站內找的,親測有效。以下是連結:大神的部落格 關於python3.7 我是在PyCharm上執行的,python3.7.但是本文的一些庫有些還沒有安,所以額外安裝了opencv-python等庫。 關於ffmpeg 在突然想要做字