This program scans pixels and prints accordingly. It will work with any font. For better output please use bigger size
Few examples this would be as font, I just made image to see properly in web.
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, 20);
      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 getTexualChars(String strText)  throws Throwable {
            List returnList =  new ArrayList(); 
            for (byte lbyte : strText.getBytes()) {
                  TextualChar tChar = getTextualChar((char) lbyte);
                  returnList.add(tChar);
            }
            return returnList;
      }
      public static void main(String[] args) throws Throwable {
            List textualCharList = getTexualChars( "Ayantika");
            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;
            }
      }
}


 
