Java tutorial
/** * * @author Aniruddha Dutta Chowdhury * a.d.chowdhury at gmail.com * If provided any string this program will give this type of * ouput * @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@ @@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@ @@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@ @@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@ @@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@ @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@ @@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@ @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@ @@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@ @ @@@@@@@@@@ @@ @@@@@@@@ @@@@@ @ @@@@@ @@@@@@ @@@@@@@@@ @@ @@@@@@@@@ @@ @@@@@ @@ @@@@@@@@@@@@ @@@@@@@ @@@@@@@ @@@ @@@@@@@@@@ @ @@@@@@ @@@@@ @@@@@@ @@@@@@ @@@@@@@ @ @@@@@@@ @ @@@@@ @ @@@@@@@@ @@@@@ @@@@@@@ @@@ @@@@@@@@@@ @@@@@@ @@@@@ @@@@@@ @@@@@@ @@@@@@ @@@@@@ @@@@@ @@@@@@@@ @@@@ @@@@@@ @@@ @@@@@@@@@ @@@ @@@@@ @@@@@ @@@@@@@@@@ @@@@@@ @@@@@@ @@@ @@@@@@ @@@ @@@@@ @@@ @@@@@@ @@@@ @@@@ @@@@@@ @@@@@ @@@@@@@@@ @@@@@ @@@@@ @@@@@ @@@@@@@@@@ @@@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@@@ @@@@@@ @@@@ @@@@@@ @@@@@ @@@@@@@@@ @@@@@@ @@@@@ @@@@@ @@@@@@@@@@@ @@@@@@ @@@@@ @@@@@@@ @@@@@ @@@@@@@ @@@@@ @@@@@@ @@@@@@@@@@@@@@@ @@@@ @@@@@ @@@@@@ @@@@@@@@ @@@@@@ @@@@@ @@@@@ @@@@@@@@@@@ @@@@@@ @@@@@ @@@@@@@ @@@@@ @@@@@@@ @@@@@ @@@@@@ @@@@@@@@@@@@@ @@@@ @@@@@ @@@@@@@@ @@@@@@ @@@@@ @@@@@ @@@@@@@@@@@ @@@@@@ @@@@@ @@@@@@@ @@@@@ @@@@@@@ @@@@@ @@@@@@ @@@@@@@@@ @@@@ @@@@@ @@@@@@@@ @@@@@@ @@@@@ @@@@@ @@@@@@@@@@@ @@@@@@ @@@@@ @@@@@@@ @@@@@ @@@@@@@ @@@@@ @@@@@@ @@@@@@ @@@@ @@@@ @@@@@@@ @@@@@@ @@@@@ @@@@@ @@@@@@@@@@@ @@@@@@ @@@@@ @@@@@@@ @@@@@ @@@@@@@ @@@@@ @@@@@@ @@@@@@ @@@ @@@@ @@@@ @@@@@@@ @@@@@@ @@@@@ @@@@@ @@@@@@@@@@@ @@@@@@ @@@@@ @@@@@@@ @@@@@ @@@@@@@ @@@@@ @@@@@@ @@@@@ @@@@@@ @@@@ @@@@ @@@@@@@@@ @@@@@@@ @@@@@@ @@@@@ @@@@@ @@@@@@@@@@@ @@@@@ @@@@@@ @@@@@ @@@@@@ @@@@@ @@@@@ @@@@@@ @@@@@ @@@@@@ @@@@ @@@ @@@@@@@@@@@ @@@@@@ @@@@@@ @@@@@ @@@@@ @@@@@@@@@@@ @@@ @@@@@@ @@@ @@@@@@ @@@ @@@@@ @@@@@@ @@@@@ @@@@ @@@@ @@@ @@@@@@@@@@@ @@@@@@ @@@@@@ @@@@@ @@@@@ @@@@@@@@@@@@ @@@@@@@ @@@@@@@ @@@@@ @@@@@@ @@@@@ @@@@ @@@ @@@@@@@@@@@ @@@@@@ @@@@@@ @@@@@ @@@@@ @@@@@@@@@@@@ @ @@@@@@@ @ @@@@@@@ @ @@@@@ @@@@@@ @@@@@@ @ @@@@ @@ @@@@@@@@@@@@@ @@@@@ @@@@@@ @@@@@ @@@@@ @@@@@@@@@@@@@@ @@ @@@@@@@@@ @@ @@@@@@@@@ @@ @@@@@ @@@@@@ @@@@@@@@ @@@ @@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ */ import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.awt.image.PixelGrabber; import java.util.ArrayList; import java.util.List; public class FontAlgo { private static final char CHAR_TO_PATTERN = '@'; private static final int WIDTH = 50; private static final int HEIGHT = 50; private static final boolean isReverse = true; private static final Font appliedFont = new Font("Couirer new", Font.BOLD, 30); private static TextualChar getTextualChar(char a_char) throws Throwable { BufferedImage bImg = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); Graphics g = bImg.getGraphics(); g.setColor(Color.green); g.fillRect(0, 0, WIDTH, HEIGHT); g.setFont(appliedFont); g.setColor(Color.black); g.drawString(new String(new char[] { a_char }), 10, g.getFontMetrics().getHeight()); PixelGrabber p = new PixelGrabber(bImg, 0, 0, WIDTH, HEIGHT, true); if (p.grabPixels()) { char[][] pattern = new char[WIDTH][HEIGHT]; int baseColourPixel = 0, contrastColourPixel = 0, x1 = 0, x2 = 0, y1 = 0, y2 = 0; int[] pixels = (int[]) p.getPixels(); baseColourPixel = pixels[0]; // System.out.println("base: " + base); int xCounter = 0, yCounter = 0; for (int iPixel : pixels) { // System.out.println(iX + " - " + iY); if (isReverse) { pattern[xCounter][yCounter] = iPixel == baseColourPixel ? CHAR_TO_PATTERN : ' '; } else { pattern[xCounter][yCounter] = iPixel != baseColourPixel ? CHAR_TO_PATTERN : ' '; } yCounter++; if (yCounter > 49) { xCounter++; yCounter = 0; } if (contrastColourPixel == 0 && iPixel != baseColourPixel) { contrastColourPixel = iPixel; x1 = xCounter - 2; y1 = yCounter - 3; y2 = yCounter + 3; } if (contrastColourPixel == iPixel) { x2 = xCounter + 3; if (y1 > (yCounter - 3)) { y1 = yCounter - 3; } if (y2 < (yCounter + 3)) { y2 = yCounter + 3; } } } return new TextualChar(x1, x2, y1, y2, pattern); } return null; } private static List<TextualChar> getTexualChars(String strText) throws Throwable { List<TextualChar> returnList = new ArrayList<TextualChar>(); for (byte lbyte : strText.getBytes()) { TextualChar tChar = getTextualChar((char) lbyte); returnList.add(tChar); } return returnList; } public static void main(String[] args) throws Throwable { List<TextualChar> textualCharList = getTexualChars("Aniruddha"); TextualChar tChar1 = textualCharList.get(0); int endPos = tChar1.getxPos2(); for (int iCounter = tChar1.getxPos1(); iCounter < endPos; iCounter++) { for (TextualChar tChar : textualCharList) { if (endPos < tChar.getxPos2()) { endPos = tChar.getxPos2(); } for (int iInnerCounter = tChar.getyPos1(); iInnerCounter < tChar.getyPos2(); iInnerCounter++) { System.out.print(tChar.getPixelPattern()[iCounter][iInnerCounter]); } } System.out.println(); } } static class TextualChar { private int xPos1 = 0; private int xPos2 = 0; private int yPos1 = 0; private int yPos2 = 0; private char[][] pixelPattern = new char[WIDTH][HEIGHT]; public TextualChar(int xPos1, int xPos2, int yPos1, int yPos2, char[][] a_pattern) { this.xPos1 = xPos1; this.xPos2 = xPos2; this.yPos1 = yPos1; this.yPos2 = yPos2; this.pixelPattern = a_pattern; } public char[][] getPixelPattern() { return pixelPattern; } public int getxPos1() { return xPos1; } public int getxPos2() { return xPos2; } public int getyPos1() { return yPos1; } public int getyPos2() { return yPos2; } } }