Java: Havin’ Fun!
22.04 2008 11:07
Dieser kleine Beitrag soll ein bisschen zur „Motivationsrückgewinnung“ für Java dienen.
Nach stundenlangem Programmieren an einer Videothek, die eigentlich nicht wirklich spektakuläre Sachen kann, verliert man oft die Lust weiterzucoden.
Für den Lerneffekt ist dies natürlich nicht sehr optimal.
Es hilft oft viel mehr, wenn man selber Programme schreibt und an diesen, dann lernt.
Ich hab mir gedacht, dass ich euch ein kleines „ASCII-Art“-Programm zeige, das mit recht wenig Aufwand ziemlich coole Bilder produzieren kann ;)
Sooo...
Was soll das Programm machen?
Dieses Programm soll ein Bild einlesen und die Grauwerte der Pixel in ein zweidimensionales Array speichern, diesen Werten ein ASCII-Zeichen zuweisen und diese dann ausgeben.
Wie liest man Bilder ein?
Bildereinlesen ist gar nicht so schwer...
Diese Variante ist im Vorgegebenen Teil der "PhotoHopp" - Aufgabe aus dem 1. Semester zu finden:
Toolkit toolkit = Toolkit.getDefaultToolkit();
Image srcImage = toolkit.getImage("EinBeliebigesBild.gif");
Für dieses kleine Beispiel wollen wir aber ein "BufferedImage" verwenden:
BufferedImage srcImage;
BufferedInputStream in = new BufferedInputStream(new FileInputStream(imagePath));
srcImage = ImageIO.read(in);
imagePath ist ein String, der den Pfad des einzulesenden Bildes beschreibt. z. B. "eintollesBild.gif"
Woher krieg ich die Grauwerte eines Pixels?
Dies ist ganz einfach, da wir ein BufferedImage verwenden!
Zuerst das Array erstellen:
int W = srcImage.getWidth();
int H = srcImage.getHeight();
int [][] values = new int[H][W];
Zwei Schleifen - wir wollen ja alle Pixel des Bildes haben:
for (int y = 0; y < H; y++) {
for (int x = 0; x < W; x++) {
}
}
In die Schleife den "magischen Code" eintragen:
Color col = new Color(srcImage.getRGB(x, y));
values[y][x] = ((col.getRed() + col.getGreen() + col.getBlue())/3);
Der Grauwert einer Farbe ist der "Durchschnittswert" der 3 Farbanteile Rot, Grün und Blau.
Wie macht man aus diesem Array ein ASCII-Bild?
Am einfachsten lässt sich das realisieren, wenn man in der innersten Schleife ein "System.out.print((char)(GrauwertDerFarbe))" und am Ende der 1. Schleife ein "System.out.println()" hinschreibt. Bei dieser Methode kann das Array sogar ganz weggelassen werden.
Wenn man mehr aus diesem Bild rausholen mag, ist das Array aber ein guter Weg, da man so die Bilddaten nur einmal auslesen muss.
Für mein Bild hab ich eine "ColorTable" erstellt - also eine Tabelle die für einen Farbbereich ein bestimmtes "ASCII-Zeichen" bestimmt.
Vorher:

Als Ascii-Art:

(der Text wurde ein bisschen gestaucht, da das Programm die Zeichenhöhe und -breite noch nicht berücksichtigt)
Hier ein paar Anwendungen:


Das Programm (ein bisschen erweitert ;) ) als .jar File
Kommentar von Dominik Felber am 30. 04. 2008 um 19:01 Uhr