Java - 在图像中正确绘制多行字符串

时间:2011-11-17 13:24:05

标签: java graphics image-processing watermark

我正在尝试使用java编写水印程序,所以我找到了同样的this piece of code

我为自己的目的做了自己的改编(Full src:https://gist.github.com/1373080/

 /**
 *
 * This method  converts a multiline string into an ArrayList of Strings
 * Each item on the array list is a line of the string.
 * @param str A multiline string
 * @return An ArrayList of strings , a string per line of text
 * @see java.util.ArrayList
 */
private static ArrayList<String> convertStringToLineString(String str){
    ArrayList<String> string = new ArrayList<String>();
    String s = new String ();
    char [] ca = str.toCharArray();

    for(int i=0;i<ca.length;i++){
        if(ca[i] == '\n'){
            string.add(s);
            s = new String();
        }
        s += ca[i];
    }
    return string;
}

字符串是这样绘制的

    int x =(img.getIconWidth() - (int) rect.getWidth()) / 2,
    y =(img.getIconHeight() - (int) rect.getHeight()) / 2;

    ArrayList<String> watermarks = convertStringToLineString(watermark);
    for (String w : watermarks){
    g2d.drawString(w,x,y);
        y+=20;
    }

我面临的问题是像日历一样的字符串

 November 2011      
Su Mo Tu We Th Fr Sa  
       1  2  3  4  5  
 6  7  8  9 10 11 12  
13 14 15 16 17 18 19  
20 21 22 23 24 25 26  
27 28 29 30   
包含多行的

无法正确绘制。

示例enter image description here

PS:我对使用java的任何类型的解决方案持开放态度,即使是那些使用其他库的解决方案。

使用以下行工作

g2D.setFont(new Font("Monospaced", Font.PLAIN, 12));

但必须有一个更优雅的解决方案适用于任何类型的字体。

2 个答案:

答案 0 :(得分:3)

我不太喜欢分割多行字符串的方法。试试这个:

public static List<String>  convertStringToLineString(String str) {
    if (str==null)
        return null;

    String[] parts = str.split("\n");
    return Arrays.asList(parts);
}

答案 1 :(得分:2)

问题是空格占用的水平空间小于比例字体中的数字。最简单的解决方法是使用这样的固定宽度字体:

g2D.setFont(new Font("Monospaced", Font.PLAIN, 12));

在绘制文本之前。

在不使用其他库的情况下,也可以在使用比例字体时制作自己的网格,但这样做更多。