Program ASCII ART Converter berbasis JAVA
Method untuk mengubah ukuran gambar
public static BufferedImage resizeImage(BufferedImage image, int scale){
int outWidth, outHeight;
if(scale <= 1) return image;
double ratio = (scale / (double)image.getWidth());
outWidth = scale;
outHeight = (int)(ratio * (double)image.getHeight());
BufferedImage resizedImage = new BufferedImage(outWidth, outHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D graphics2D = resizedImage.createGraphics();
graphics2D.drawImage(image, 0, 0, outWidth, outHeight, null);
graphics2D.dispose();
return resizedImage;
}
Method untuk mendapatkan luminance dari Color
public static double getLuminance(Color c, boolean dibalik){
double luminance = ((0.2126 * (double)c.getRed()) + (0.7152 * (double)c.getGreen()) + (0.0722 * (double)c.getBlue()))/ 255f;
if (dibalik) {
luminance = 1 - luminance;
}
return luminance;
}
Method untuk mendapatkan karakter ASCII dari luminance
public static String getAsciiFromLuminance(double luminance){
int indexCari = 0;
for (int i = 0; i < ascii.size(); i++) {
CharMetrics metric = ascii.get(i);
if (luminance >= metric.getLuminance()) {
indexCari = i;
break;
}
}
return ascii.get(indexCari).getAscii();
}
Untuk list dari karakter ASCII beserta tingkat luminance bisa mengikuti seperti berikut atau dengan kombinasi kalian sendiri
public static ArrayList<CharMetrics> ascii = new ArrayList<>(){{
add(new CharMetrics(" ", 1.0));
add(new CharMetrics("`", 0.95));
add(new CharMetrics(".", 0.92));
add(new CharMetrics(",", 0.9));
add(new CharMetrics("-", 0.8));
add(new CharMetrics("~", 0.75));
add(new CharMetrics("+", 0.7));
add(new CharMetrics("<", 0.65));
add(new CharMetrics(">", 0.6));
add(new CharMetrics("o", 0.55));
add(new CharMetrics("=", 0.5));
add(new CharMetrics("*", 0.35));
add(new CharMetrics("%", 0.3));
add(new CharMetrics("X", 0.1));
add(new CharMetrics("@", 0.0));
}};
Untuk class CharMetrics seperti berikut
public class CharMetrics {
private String ascii;
private double luminance;
public CharMetrics(){
this(null,0);
}
public CharMetrics(String karakter, double luminance){
this.ascii = karakter;
this.luminance = luminance;
}
public double getLuminance(){
return luminance;
}
public void setLuminance(double luminance){
this.luminance = luminance;
}
public String getAscii(){
return ascii;
}
public void setAscii(String karakter){
this.ascii = karakter;
}
}
Lalu main method-nya
/* Urutkan list dari karakter ASCII kalian
* berdasarkan tingkat luminance nya
*/
Collections.sort(ascii, new Comparator<CharMetrics>(){
@Override
public int compare(CharMetrics m1, CharMetrics m2){
Double l1 = m1.getLuminance();
Double l2 = m2.getLuminance();
return l2.compareTo(l1);
}
});
/* Jalankan proses konversi di latar belakang
* karena prosesnya akan memakan banyak waktu
* tergantung ukuran gambar yang sudah diperkecil
*
* Gunakan package Thread pada java.lang.Thread
* dan lakukan @Override pada method run() seperti dibawah
*
* Dan jangan lupa handle error dengan keyword try dan catch
*/
Thread thread = new Thread(){
public void run(){
try{
System.out.println("Starting convert...");
BufferedImage image = ImageIO.read(new File("asciiart/saw.png"));
String hasil = "";
BufferedImage scaledImage = resizeImage(image,50);
int height = scaledImage.getHeight();
int width = scaledImage.getWidth();
for (int row = 0; row < height; row++ ) {
for (int col = 0; col < width; col++ ) {
Color pix = new Color(scaledImage.getRGB(col,row));
double luminance = getLuminance(pix,false);
hasil += getAsciiFromLuminance(luminance);
}
hasil += "\n";
}
System.out.println(hasil);
}catch (IOException e) {
e.printStackTrace();
}
}
};
thread.start();
Untuk memudahkan kalian, berikut adalah program lengkapnya.
Program lengkap-nya (Simpan dalam file bernama ImageToASCII.java)
import java.io.File;
import javax.imageio.ImageIO;
import java.io.IOException;
import java.awt.image.BufferedImage;
import java.awt.Graphics2D;
import java.awt.Color;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.lang.Thread;
public class ImageToASCII {
public static ArrayList<CharMetrics> ascii = new ArrayList<>(){{
add(new CharMetrics(" ", 1.0));
add(new CharMetrics("`", 0.95));
add(new CharMetrics(".", 0.92));
add(new CharMetrics(",", 0.9));
add(new CharMetrics("-", 0.8));
add(new CharMetrics("~", 0.75));
add(new CharMetrics("+", 0.7));
add(new CharMetrics("<", 0.65));
add(new CharMetrics(">", 0.6));
add(new CharMetrics("o", 0.55));
add(new CharMetrics("=", 0.5));
add(new CharMetrics("*", 0.35));
add(new CharMetrics("%", 0.3));
add(new CharMetrics("X", 0.1));
add(new CharMetrics("@", 0.0));
}};
public static BufferedImage resizeImage(BufferedImage image, int scale){
int outWidth, outHeight;
if(scale <= 1) return image;
double ratio = (scale / (double)image.getWidth());
outWidth = scale;
outHeight = (int)(ratio * (double)image.getHeight());
BufferedImage resizedImage = new BufferedImage(outWidth, outHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D graphics2D = resizedImage.createGraphics();
graphics2D.drawImage(image, 0, 0, outWidth, outHeight, null);
graphics2D.dispose();
return resizedImage;
}
public static double getLuminance(Color c, boolean dibalik){
double luminance = ((0.2126 * (double)c.getRed()) + (0.7152 * (double)c.getGreen()) + (0.0722 * (double)c.getBlue()))/ 255f;
if (dibalik) {
luminance = 1 - luminance;
}
return luminance;
}
public static String getAsciiFromLuminance(double luminance){
int indexCari = 0;
for (int i = 0; i < ascii.size(); i++) {
CharMetrics metric = ascii.get(i);
if (luminance >= metric.getLuminance()) {
indexCari = i;
break;
}
}
return ascii.get(indexCari).getAscii();
}
public static void main(String[] args) {
Collections.sort(ascii, new Comparator<CharMetrics>(){
@Override
public int compare(CharMetrics m1, CharMetrics m2){
Double l1 = m1.getLuminance();
Double l2 = m2.getLuminance();
return l2.compareTo(l1);
}
});
// Membuat Thread untuk menjalankan program koversi di latar belakang
Thread thread = new Thread(){
// @Override method run
// method ini yang nantinya akan dijalankan di latar balekang
public void run(){
try{
// Pemberitahuan bahwa proses konversi dimulai
System.out.println("Starting convert...");
// Input file gambar sebagai BufferedImage
BufferedImage image = ImageIO.read(new File("asciiart/profil.jpeg"));
// Pembuatan variabel hasil untuk menampung karakter ASCII
// yang sudah didapatkan dari konversi
String hasil = "";
// Mengecilkan ukuran gambar
BufferedImage scaledImage = resizeImage(image,100);
// Membuat variabel height dan width
// untuk menampung ukuran gambar yang sudah diperkecil
// yang nantinya digunakan sebagai kondisi perulangan
int height = scaledImage.getHeight();
int width = scaledImage.getWidth();
// Perulangan diluar untuk mengakses setiap baris pixel
for (int row = 0; row < height; row++ ) {
// Perulangan didalam untuk mengakses setiap pixel yang ada pada baris
// yang sedang diakses perulangan diluar
for (int col = 0; col < width; col++ ) {
// Mengambil warna dari pixel
Color pix = new Color(scaledImage.getRGB(col,row));
// Mengambil tingkat luminance (pencahayaan) dari warna pada pixel
double luminance = getLuminance(pix,false);
// Mengambil karakter ASCII dari tingkat luminance lalu menambahkannya ke variabel hasil
hasil += getAsciiFromLuminance(luminance);
}
// Akses satu baris sudah selesai
// ganti baris dan variabel hasil juga ganti baris
hasil += "\n";
}
// Proses konversi selesai
// Menampilkan hasil
System.out.println(hasil);
}catch (IOException e) {
// Menampilkan error jika terjadi
e.printStackTrace();
}
}
};
// Mulai jalankan thread
thread.start();
}
}
// Class CharMetrics berada di file yang sama dengan class ImageToASCII
class CharMetrics {
private String ascii;
private double luminance;
public CharMetrics(){
this(null,0);
}
public CharMetrics(String karakter, double luminance){
this.ascii = karakter;
this.luminance = luminance;
}
public double getLuminance(){
return luminance;
}
public void setLuminance(double luminance){
this.luminance = luminance;
}
public String getAscii(){
return ascii;
}
public void setAscii(String karakter){
this.ascii = karakter;
}
}
Hasil dari program diatas adalah
Starting convert...
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%~>XXXXXXXXXXX%<+oXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-~XXXXXXXXXXXXXXXXXX%*--XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX*-%XXXXXXXXXXXXXXXXXXXXXXX*~,XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-+XXXXXXXXXXXXXXXXXXXXXXXXXX%=-*XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-~XXXXXXXXXXXXXXXXXXXXXXXXXXXX%%,.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX*-*XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXo-=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX~+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX*,.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX~-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%%,.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXX--XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%*.+XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-*XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%*,-XXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXX~~XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%%.,XXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXX->XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%%.,XXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXX*-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%%.,XXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXX-oXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%*.-XXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXX<-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX%%..XXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXX~~XXXXXXXXXX%o<<++<<o*XXXXXXXXXXXXXXXXXXXXX%-.XXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXX-*XXXXXXX%%<<<<+++++++o=XXXXXXXXXXXXXXXXXXXX*.XXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXX--XXXXXXXX<<++<+++++++++ooXXX%%<<+=*XXXXXXXX%*.>XXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXX~-XXXXXX*<+++++++++++++++++<+++++++=oXXXXXXX%*,.XXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXX--XXXX%X<<++++++++++++++++++++++++++ooXXXXXX%*,.XXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXX--XXXXX%><+++++++++++++++~~~~~~++++++>=XXXXXXX.,XXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXX--XXXXXX+<++++++++++++~~~~~~~~~++++++<oXXXXX%%..XXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXX-~XXXX%o<+++++++++++++~~~~~~~~~+++++++oXXXXX%%~%.XXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX~X~XXXXX<<++++++++++++~~~~~~~~~~+++++++o=XXXX%%,X%.XXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXX~*X~XXXX%<<++++++++++++~~~~~~~~~~+++++++o=XXXX%%,%XX,XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXX~**X**XXXX*<<++++++++++++~~~~~~~~+++++++++>=XXXX%=>*XX-XXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXX~**%X<XXX%<<+++++++++++~~~~~~~~~~~~+++++++ooXXXX*-*%%%XX+XXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXX-*%%%X+XX%%<<++++++++++~~~~~~~~~~~~~~+++++++oXXXX%<o%%%XXX-XXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXX+X%%%%X+XXX><+++++++++++~~~~~~~~~~~~~~+++++++o*XXX%~**%%%%X%-XXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXX*>%%%%%X<XXX%<<+++++++++~~~~~~~~~~~~~~~~+++++++o%XX%%,%%%%%*X*,XXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXX~X%%%%%%X+X*X<<+++++~~~~~~~~~~~~~~~~~~~~~~+++++ooXXX%,%%%%%%%X*.XXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXX~*%%%%%%*X<X*X<<o=X%%<+~~~~~~~~~~~~~~~~~~~~~~++~o=XX%%-%%%%%%XX<*XXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXX-*%%%%%%%XX~X%X<=oXXXXX%*>~~~~~~~~~~~+~+~~~++>>++ooXX%%,%%%%%%%X%.XXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXX~X%%%%%%XX%X+*%><ooXXXXXXXXo<++++++<++<+<>XXXXXX%==XX*%~%%%%%%%*X%<XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX~*%%%%%%*XX*X%=<<+++<+>oXXXX*><<+++++ooXXXXXXXXX%**X%%-XXX%%%%%%%%X~*XXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX~*%%%%%%XXXX-*<<+++<+<<+<<=o%>>><<++>=XXX=><+<+++o>X***XXXX%%%%%%%X%.XXXXXXXXXXXXXXX
XXXXXXXXXXXXXXX>*%%%%%%%XXXXX<*<<+<+=+++%*%+o>>>>><>>>>**XXX**><++>=*%-XXXX%%%%%%*X%-XXXXXXXXXXXXXXX
XXXXXXXXXXXXXXX-*%%%%%%XXXXX%~-=+++++<>+%**<-=<>><<<>=<*+***<-*<<<o=*o~XXXXX%%%%%%%X*.XXXXXXXXXXXXXX
XXXXXXXXXXXXXX~*%%%%%%XXXX%-`.*+<++++<o%X**<>+<+++<<=o**+*X-*+<++o+*`--*XXX*%%%%%%X%,XXXXXXXXXXXXXXX
XXXXXXXXXXXXX-*%%%%%%XXXXX.X~`**<<++++++++++++++++++++<++~+<+++++o+*`.X-%XXX%%%%%%%X*%XXXXXXXXXXXXXX
XXXXXXXXXXXXX-*%%%%%%XXX@=>XX.`=**<<<++++<+<++<<**%**><+++++++++++>+-`XX+XXX%%%%%%%X*-XXXXXXXXXXXXXX
XXXXXXXXXXXXX-*%%%%%XXXX%.XXo`**X*%<<++<=>**********X%=<++++++++<~*,.XXX-%XX%%%%%%%XX.XXXXXXXXXXXXXX
XXXXXXXXXXXX>*%%%%%%XXX*,XX~`***************************XX%*o<<+=*..XXXXX-%XX%%%%%%X%.XXXXXXXXXXXXXX
XXXXXXXXXXXX~*%%%%%%XXX*-XXXX,.************************************..XXXX-*XX*%%%%%XX-XXXXXXXXXXXXXX
XXXXXXXXXXXXX*%%%%%%XXX*-XXXXX`.***********************************-.XXXXX+*XX%%%%%%X%.XXXXXXXXXXXXX
XXXXXXXXXXXXo*%%%%%%XX%.XXXX~`***********************************.`XXXXXXXX-%X*%%%%%X%,XXXXXXXXXXXXX
XXXXXXXXXXXX-*%%%%%%XX%,XXXXX`***********************************..XXXXXXXX-%X%%%%%%*%+*XXXXXXXXXXXX
XXXXXXXXXXXX-*%%%%%*XX>XXXXXXo`**********************************..XXXXXXXX*=X%%%%%%*X*.XXXXXXXXXXXX
XXXXXXXXXXXX-*%%%%%%X%,XXXXXXX`.*********************************.,XXXXXXXXX-%%%%%%%%X%.XXXXXXXXXXXX
XXXXXXXXXXXX-*%%%%%%X*.XXXXXXX<`=********************************,.XXXXXXXXX-XX%%%%%%X%.XXXXXXXXXXXX
XXXXXXXXXXXX-*%%%%%%X*.XXXXXXXX`-********************************.-XXXXXXXXXX~X%%%%%%X%.XXXXXXXXXXXX
XXXXXXXXXXXX-*%%%%%%X%.XXXXXXXX-`*****************************X*-,XXXXXXXXXXX-%%%%%%%X%.XXXXXXXXXXXX
XXXXXXXXXXX~*%%%%%%X*,XXXXXXXX+`*=**************************X%**`<XXXXXXXXXX~X%%%%%XX*.XXXXXXXXXXXXX
XXXXXXXXXXX-%%%%%%%X*.XXXXXXXXXX>`*****************************X-*`-XXXXXXXX-X%%%%%%X%.XXXXXXXXXXXXX
XXXXXXXXXXX**%%%%%%X%-XXXXXXXXXXX,-**************************X*=>--`XXXXXXXXX~*%%%%%X*-XXXXXXXXXXXXX
XXXXXXXXXXX**X%%%%%*X>=XXXXXXXXX.>->************************X**~--``XXXXXXXXX~*%%%%%X%.XXXXXXXXXXXXX
XXXXXXXXXXX**%%%%%%XXX.XXXXXXXX~`~--*************************%~~--``XXXXXXXXX~%%%%%%X%.XXXXXXXXXXXXX
XXXXXXXXXXX***%%%%%%X%.XXXXXXX.`---,+***********************-~-+->`oXXXXXXXX*>%%%%%%X%.XXXXXXXXXXXXX
XXXXXXXXXX*<X%%%%%%X%.XXXXXXX..-----o*******************%*~~-----``XXXXXXXX~*%%%%%%X%-XXXXXXXXXXXXXX
XXXXXXXXXXX~X%%%%%%%X*.XXXXXX-.~---<+*********************-~---<-~`%XXXXXXX~*%%%%%%X%.XXXXXXXXXXXXXX
XXXXXXXXXXX~X%%%%%%*X%.XXXXXX``----~~=<******************~~----~-=`-XXXXXXX+*%%%%%*X%-XXXXXXXXXXXXXX
XXXXXXXXXX~***%%%%%%X%-XXXXX.,------~o<=*************X*~~------,<`-XXXXXXX~*%%%%%*XX<XXXXXXXXXXXXXXX
XXXXXXXXXXX~***%%%%%%X%.XXXX<`*-~---+-%>=>**********%Xo%-~--------``XXXXXX-%%%%%%%XX*.XXXXXXXXXXXXXX
XXXXXXXXXXX=**X%%%%%%XX-XXXX~`+-------->>o<******%*%>=o----------~``XXXXXX~*%%%%%%XXX,XXXXXXXXXXXXXX
XXXXXXXXXXXX-***%%%%%%X*,XXX-`---------*>=o*>*XXX*o>><=~---------+`.XXXXX~**%%%%%X%**-XXXXXXXXXXXXXX
XXXXXXXXXXXXX-**%%%%%%%%X*-XX-`--------~-o>>>><<<+<<<=<*-~---------``XXXXX-*%%%%%%X***.XXXXXXXXXXXXX
XXXXXXXXXXXXX~*>**%%%%%%X*-XX,.--------~-*>><<+++++++><------------`.XXXX-*%%%%%%XX*%+*XXXXXXXXXXXXX
XXXXXXXXXXXXXX>**%%%%%%%XXo>X%+~+------~+<*<<++++++<<>+-----------,`>XX*X=*%%%%%XX**>>XXXXXXXXXXXXXX
XXXXXXXXXXXXX-*=**X%%%%%%X%,XX-`*--------<<++++++<><o-~--------,-``XXX*>*%%%%%%XX=**-XXXXXXXXXXXXXXX
XXXXXXXXXXXXXX<*o>X%%%%%%%%X%.XXXX~,=----<-=<<++++<+<=------------*`<XX~*%%%%%%%X%o%=XXXXXXXXXXXXXXX
XXXXXXXXXXXXXXX~*o**%%%%%%%XX**XXXXX<-*~~--+<><<++<o<+---------~,=`.XX~*%%%%%%%XX***.XXXXXXXXXXXXXXX
XXXXXXXXXXXXXXX-*=o**%%%%%%%@X<*XXXXXXXXX~-*-><>><<>>*-~-------~~-`XX~*%*%%%%%%X%o**.XXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX+*ooX%%%%%%%%XX*.XXXXXXXXX`~-=<>>>*<*~---~<**+-*XXXX+*%%%%%%%%X*o*%-XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX-*oo%X%%%%%%%%XX*.XXXXXXXX~`>o>>><**X+-.XXXXXXXXXXX-*%%%%%%%%XX*>**-XXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXX+*oo**%%%%%%%%*X*-XXXXX=.>-<<o==~---.`XXXXXXXXXX-XX%%%%%%%%XX=>%*.XXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXX~*oo>**%%%%%%%%%XX*`XXXX-`*-*<*----~-`XXXXXXXXX~X%%%%%%%%%XX%oo**.XXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXX~*ooo*%%%%%%%%%%%XX*+XXX*`%-*>---+->`-XXXXXX-X%*%%%%%%%%XX%oo**.XXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXX*ooo**%%%%%%%%%%*XX*.XX+`=-*-~--~.`XXXX==X%%%%%%%%%%%%X*o>**-XXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXX~*oooo*%%%%%%%%%%%%%XXXX,*-~-->--`XXX~XXX%%%%%%%%%%%%XX=>o*X-XXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXX-%ooo>*X%%%%%%%%%%%%%%XXXXXXXXXXXXXX%%%%%%%%%%%%%%%X%ooo*X%>XXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXX*%X=ooo*X%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*XX%=>o>%*.XXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXX~*oo>oo%X%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%X%=o>o*X%.XXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXX~*=ooooo*X%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%XXX=oooo*X.XXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXX~*=ooooo*XX%%%%%%%%%%%%%%%%%%%%%%%%%%%%%XXX*oooo>*X*XXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXX~*o>ooooo=%X%%%%%%%%%%%%%%%%%%%%%%%%%XXX*oooooo*%-XXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXX~X%ooooooo>*XX%%%%%%%%%%%%%%%%%**XXXX=oooooo>**+XXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXX=*%oooooo>>>>*XXXX*%%%%%%%%XXXXX%*ooooooooo**-XXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXX-X*oooooooooooo>o%XXXXXXX*o>>ooooooooo>*X%*XXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXX%XX*oooooooooooooooooooooooooooooooo*X%-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX~X*=oooooooooooooooooooooooooo>*XXo<XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX+X*oo>oooooooooooooooooo>o>*XXo*XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX~%XX*oooooooooooooooo>*XXX<=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX+XXXXX*o>oo>=%XXXX*.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-+*XXXXX@X+<XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX->*******%.+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX+-******%*<.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-o*****%**`*XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX=-%%X%%X*%.oXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Ryomario Development
Program tersebut menggunakan BufferedImage untuk menampung file gambarnya. Berarti program tersebut tidak bisa dijalankan di Android karena Android tidak mendukung BufferedImage. Untuk program ASCII ART Android bisa menggunakan Bitmap, dan untuk kode programnya akan saya pos juga.