2011-11-17 71 views
3

我想用java寫一個水印程序,所以我發現相同的this piece of codeJava - 在圖像中正確繪製多行字符串

我做我自己適應我的目的,像這樣(全部源: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 

其中包含多行不會被繪製pr正常運行。

enter image description here

PS:我用java,即使是使用其他庫的那些願意接受任何類型的解決方案。

使用下面這行工作

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

但必須有一個更優雅的解決方案,對於任何類型的字體作品。

+0

無關,但是那個場景從哪裏來? – jkschneider

+0

@jkschneider:多數民衆贊成真的無關,任何方式在這裏是原始圖像的鏈接http://wallbase.cc/wallpaper/954211 – Gautam

回答

2

問題是空間比比例字體中的數字佔用更少的水平空間。最簡單的修復方法是使用這樣的固定寬度字體:

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

繪製文本之前。

使用比例字體制作自己的網格也可以不使用其他庫,但它是更多的工作。

+0

哇,真的工作謝謝!但是,必須有一個更優雅的解決方案。 – Gautam

+2

使用比例字體時,這是一個固有問題,如果沒有專門處理所需的對齊點,則無法修復。 – MartinZ

3

我真的不喜歡你分裂多行字符串的方法。試試這個:

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

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

好的感謝,不完全是我正在尋找的解決方案,但仍然不錯的代碼是很好的代碼。 – Gautam