用 Java 生成 ASCII 字元畫
ASCII碼藝術是一種技術,它利用ASCII標 準中的可列印字元來產生視覺藝術效果。在歷史上它有其存在的目的,當時的印表機還無法列印圖片,並且當時在郵件中嵌入影像還無法實現,所以它也用於郵件 中。本文中,我將為你呈現一個非常簡單的ASCII碼藝術產生器,它由Java語言編寫,並可以配置字型和對比度。因為該產生器是我在週末用幾個小時建立 的,所以它還不完美,但卻是一個有趣的實驗。在下面你可以看到實現程式碼,並且我將解釋它的工作原理。
演算法
這個演算法很簡單。首先,我們將ASCII碼藝術品中要用到的每一個字元轉化成一張圖片,並快取它。然後,我們遍歷原始影像,對於每個字元大小的圖片塊,找出 能最佳匹配它的字元。為了實現這一步,我們首先對原始影像做一些預處理:我們先將影像轉換為灰度圖,然後讓其通過一個閾值濾波器,此時就得到了一個黑白對比圖,我們可以將其與每個字元對比並計算差值。接著,對每個圖片塊選取最相似的字元,一直進行下去,直到整個影像都轉換完成。此外,我們還可以根據需要調 整閾值大小來影響對比度,並增強最終的結果。
為了實現這一點,一個非常簡單的方法是將紅、綠、藍的值都設定成三種顏色的平均值:
紅=綠=藍 =(紅+綠+藍)/ 3
如果這個值低於閾值,我們就將它設定成白色,否則我們將其設定成黑色。最後,我們將影像與每個字元以畫素為單位進行比較並計算出平均誤差。如下面的圖片和程式碼片段所示:
int r1 = (charPixel >> 16) & 0xFF; int g1 = (charPixel >> 8) & 0xFF; int b1 = charPixel & 0xFF; int r2 = (sourcePixel >> 16) & 0xFF; int g2 = (sourcePixel >> 8) & 0xFF; int b2 = sourcePixel & 0xFF; int thresholded = (r2 + g2 + b2) / 3 < THRESHOLD ? 0 : 255; error = Math.sqrt((r1 - thresholded) * (r1 - thresholded) + (g1 - thresholded) * (g1 - thresholded) + (b1 - thresholded) * (b1 - thresholded));
因為顏色是儲存在單個整數中,所以我們首先提取單個顏色成分並執行上面我解釋的計算。另一個挑戰是準確地測量字元尺寸,並以它們為中心作圖。在試驗了多種方法之後,我最終發現這個方法已經足夠好:
Rectangle rect = new TextLayout(Character.toString((char) i), fm.getFont(), fm.getFontRenderContext()).getOutline(null).getBounds(); g.drawString(character, 0, (int) (rect.getHeight() - rect.getMaxY()));
你可以從GitHub上下載完整的原始碼。
下面是一些使用不同字型尺寸和閾值的例子。
相關文章
- 字元編碼發展史1 — ASCII和EASCII字元ASCII
- [20210422]如何檢視字元的ascii編碼.txt字元ASCII
- c語言中文和ascii碼字元分離C語言ASCII字元
- python字元畫Python字元
- 輸入一個ASCII碼,輸出對應的字元ASCII字元
- 字元作畫,我用字元畫個冰墩墩字元
- 用Python生成馬賽克畫Python
- 【輕鬆一刻】Java製作字元動畫Java字元動畫
- steam在該windows版本上無法從含有非ascii字元怎麼辦WindowsASCII字元
- ASCII表ASCII
- 7.23 ASCIIASCII
- ASCII 表ASCII
- 前端列印console.log 字元畫前端字元
- 教你基於MindSpore用DCGAN生成漫畫頭像
- 安裝benchmarksql報java:143: error: unmappable character for encoding ASCIISQLJavaErrorAPPEncodingASCII
- Java-字元流Java字元
- java跳脫字元Java字元
- ASCII對照表ASCII
- 01-Python 圖片轉字元畫Python字元
- python 列印 ASCII表PythonASCII
- 用AI繪畫怎麼可以把照片一鍵生成漫畫圖?詳細ai繪畫教程來啦!AI
- 簽名生成 引數列表(Map、List)ASCII碼從小到大排序(字典順序)ASCII排序
- 實現SLIC演算法生成畫素畫演算法
- java繪圖基礎 : 用java程式碼畫一個房子Java繪圖
- 網頁小實驗——用canvas生成精靈動畫圖片網頁Canvas動畫
- Java IO: 其他字元流(下)Java字元
- 【Web動畫】科技感十足的暗黑字元雨動畫Web動畫字元
- js視訊轉字元畫 —— 寫一個屬於自己的字元轉換器JS字元
- java學習日記day03---字母數字ascii編碼JavaASCII
- python ascii int互換PythonASCII
- SyntaxError: Non-ASCII character 與 Cannot decode using encoding "ascii" 錯誤解決ErrorASCIIEncoding
- 1374 生成每種字元都是奇數個的字串字元字串
- 福利!Python製作動態字元畫(附原始碼)Python字元原始碼
- Java 字元流檔案讀寫Java字元
- LintCode 1905. 字元刪除 Java字元Java
- java學習日記-字元流Java字元
- Ai繪畫教程:如何用ai繪畫軟體來生成城市插畫AI
- java版gRPC實戰之一:用proto生成程式碼JavaRPC
- 【超好用API 推薦2】用Java生成Xmind腦圖APIJava