java 生成圖片使用 g.drawString 時,若是文本太長,超出的部分會丟失java
drawString 無法自動換行ide
解決方案示例Demo以下 : 測試
1 import java.awt.Color; 2 import java.awt.Font; 3 import java.awt.Graphics2D; 4 import java.awt.font.FontRenderContext; 5 import java.awt.geom.Rectangle2D; 6 import java.awt.image.BufferedImage; 7 import java.io.FileOutputStream; 8 import java.io.IOException; 9 import java.util.ArrayList; 10 import java.util.List; 11 12 import com.sun.image.codec.jpeg.JPEGCodec; 13 import com.sun.image.codec.jpeg.JPEGImageEncoder; 14 15 16 public class DrawStringTest { 17 18 /** 19 * @param args 20 */ 21 public static void main(String[] args) { 22 BufferedImage bufferImage = null; 23 FileOutputStream output = null ; 24 25 String info = "客戶姓名:唐伯虎;身份證號:12345678906666666;某某合同編號:張店哈哈哈哈高抵字2015年第02-30在參數StringFormat標誌位 !"; 26 int w = 500 ;//畫布寬度 27 int h = 300 ;//畫布高度 28 try { 29 bufferImage = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB) ; 30 Graphics2D g = bufferImage.createGraphics() ; 31 Font font = new Font("微軟雅黑",Font.PLAIN,30) ; 32 List<String> line_list = new ArrayList<String>(); 33 34 FontRenderContext frc = g.getFontRenderContext(); 35 g.getFontRenderContext(); 36 Rectangle2D stringBounds = font.getStringBounds(info, frc); 37 double fontWidth = stringBounds.getWidth(); 38 System.out.println("不換行時文本寬度 : "+fontWidth); 39 if(fontWidth <= w){ 40 line_list.add(info); 41 }else{ 42 int text_width = w ;//輸出文本寬度,這裏就以畫布寬度做爲文本寬度測試 43 double bs = fontWidth/text_width ;//文本長度是文本框長度的倍數 44 int line_char_count = (int)Math.ceil(info.length() / bs) ;//每行大概字數 45 int begin_index = 0 ; 46 while(begin_index < info.length()){ 47 int end_index = begin_index + line_char_count ; 48 if(end_index >= info.length()){ 49 end_index = info.length(); 50 } 51 String line_str = info.substring(begin_index, end_index); 52 Rectangle2D tempStringBounds = font.getStringBounds(line_str, frc); 53 int tzcs = 0 ;//調整次數 54 int tzzs = 1 ;//調整字數,臨時文本的字符串長度大於要求的文本寬度時,每次減小臨時文本的字數,而後從新測量文本寬度 55 while(tempStringBounds.getWidth() > text_width){ 56 line_str = line_str.substring(0, line_str.length() - tzzs );//每次向前 tzzs 個字符從新計算(待優化) 57 tempStringBounds = font.getStringBounds(line_str, frc); 58 tzcs++; 59 } 60 System.out.println("調整"+(end_index - begin_index -line_str.length())+"個數字,調整了"+tzcs+"次,當前行寬度:"+tempStringBounds.getWidth()); 61 line_list.add(line_str); 62 begin_index = begin_index + line_str.length() ; 63 } 64 } 65 66 g.setColor(Color.WHITE); 67 g.fillRect(0,0,w,h);//填充整個屏幕 68 g.setFont(font); 69 g.setColor(Color.RED) ; 70 71 for(int i = 0;i<line_list.size();i++){ 72 String line_str = line_list.get(i); 73 g.drawString(line_str, 0, (i+2)*35) ;//35爲每行的高度 74 } 75 76 g.drawString("Graphics2D.drawString換行示例", 0, 35) ; 77 g.dispose() ; 78 79 output = new FileOutputStream ("E:/1.jpg");//輸入文件到E盤根目錄 80 System.out.println("文件 E:/1.jpg 已經生成"); 81 JPEGImageEncoder en = JPEGCodec.createJPEGEncoder(output) ; 82 en.encode(bufferImage) ; 83 84 output.flush() ; 85 } catch (Exception e) { 86 e.printStackTrace(); 87 } finally{ 88 if(output!=null) { 89 try { 90 output.close(); 91 } catch (IOException e) { 92 e.printStackTrace(); 93 } 94 } 95 System.out.println("end/:-)"); 96 } 97 98 } 99 100 }
經過計算文本寬度實現自動換行優化