下面这个小程序可以获取字符串点阵并在命令行下打印输出:
public class StringPixelUtils {
private static final Map<String, boolean[][]> lettersMap = new HashMap<>();
/* 在内存 BufferedImage里输出文本并获取它的像素点 */
public static boolean[][] getStringPixels(String fontName, int fontStyle, int fontSize, String s) {
String key = new StringBuilder(fontName).append("_").append(fontStyle).append("_").append(fontSize).append("_")
.append(s).toString();
if (lettersMap.containsKey(key))
return lettersMap.get(key);
Font font = new Font(fontName, fontStyle, fontSize);
BufferedImage bi = new BufferedImage(fontSize * 8, fontSize * 50, BufferedImage.TYPE_INT_RGB);
Graphics g = bi.getGraphics();
Graphics2D g2d = (Graphics2D) g;
g2d.setFont(font);
FontMetrics fm = g2d.getFontMetrics();
int strHeight = fm.getAscent() + fm.getDescent() - 3;
int strWidth = fm.stringWidth(s);
g2d.drawString(s, 0, fm.getAscent() - fm.getLeading() - 1);
boolean[][] b = new boolean[strHeight][strWidth];
for (int y = 0; y < strHeight; y++)
for (int x = 0; x < strWidth; x++)
if (bi.getRGB(x, y) == -1)
b[y][x] = true;
else
b[y][x] = false;
lettersMap.put(key, b);
return b;
}
public static void main(String[] args) {
boolean[][] c = getStringPixels(Font.SANS_SERIF, Font.PLAIN, 12, "Test点阵输出");
for (int y = 0; y < c.length; y++) {
boolean[] line = c[y];
for (int x = 0; x < line.length; x++)
if (c[y][x])
System.out.print("*");
else
System.out.print(" ");
System.out.println();
}
}
}
getStringPixels的参数依次为字体名,字体风格,字体大小及要获取像素点的字符串。上例显示结果为:
** **** * * * *
******* * * * * ******** **** * * * * *
* * ****** * * * * * * * * *
* *** *** *** * * * * * * * * *** * * * *
* * * * * * ******** * * * * * * *********
* * * * * * * * * ***** ******* * *
* ***** *** * * * * * * * * * * * * * *
* * * * ******** ** * ****** ***** * * * * *
* * * * * * * * * *** * * * * * * *
* *** *** ** * * * * * * * *** * ***********
* * * * * * * * * ** * *