一、本圖片生成器具有以下功能特性:
1、可以設置圖片的寬度、高度、外框顏色、背景色;
2、可以設置圖片字體的大小、名稱、顏色;
3、可以設置輸出圖片的格式,如JPEG、GIF等;
4、可以將圖片存儲到一個文件或者存儲到一個輸出流;
5、可以為圖片增加若干條干擾線(在生成隨機碼圖片時可用此特性);
6、打印在圖片上的文字支持自動換行;
另外,本圖片生成器還用到了模板方法模式。
二、下面列出相關的源代碼
1、抽象類AbstractImageCreator的源代碼
/**本代碼在 http://www.bt285.cn http://www.5a520.cn 已使用了 */
public abstract class AbstractImageCreator { private static Random rnd = new Random(new Date().getTime()); //圖片寬度 private int width = 200; //圖片高度 private int height = 80; //外框顏色 private Color rectColor; //背景色 private Color bgColor; //干擾線數目 private int lineNum = 0; //圖片格式 private String formatName = "JPEG"; //字體顏色 private Color fontColor = new Color(0, 0, 0); //字體名稱 private String fontName = "宋體"; //字體大小 private int fontSize = 15; //##### 這裡省略成員變臉的get、set方法 ##### /** * 畫干擾線 */ private void drawRandomLine(Graphics graph){ for(int i=0;i<lineNum;i++){ //線條的顏色 graph.setColor(getRandomColor(100, 155)); //線條兩端坐標值 int x1 = rnd.nextInt(width); int y1 = rnd.nextInt(height); int x2 = rnd.nextInt(width); int y2 = rnd.nextInt(height); //畫線條 graph.drawLine(x1, y1, x2, y2); } } /** * 隨機獲取顏色對象 */ private Color getRandomColor(int base, int range){ if((base + range) > 255) range = 255 - base; int red = base + rnd.nextInt(range); int green = base + rnd.nextInt(range); int blue = base + rnd.nextInt(range); return new Color(red, green, blue); } //該方法內應用了模板方法模式 public void drawImage(String text)throws IOException{ BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); if(rectColor == null) rectColor = new Color(0, 0, 0); if(bgColor == null) bgColor = new Color(240, 251, 200); //獲取畫布 Graphics graph = image.getGraphics(); //畫長方形 graph.setColor(bgColor); graph.fillRect(0, 0, width, height); //外框 graph.setColor(rectColor); graph.drawRect(0, 0, width-1, height-1); //畫干擾線 drawRandomLine(graph); //畫字符串 drawString(graph, text); //執行 graph.dispose(); //輸出圖片結果 saveImage(image); } protected abstract void drawString(Graphics graph, String text); protected abstract void saveImage(BufferedImage image)throws IOException; }
2、類DefaultImageCreator的源代碼
該類將生成的圖片存儲到一個文件中,需要設置outputFilePath成員變量值,該成員變量值表示圖片的存儲全路徑。
Java代碼
public class DefaultImageCreator extends AbstractImageCreator { private String outputFilePath; public String getOutputFilePath() { return outputFilePath; } public void setOutputFilePath(String outputFilePath) { this.outputFilePath = outputFilePath; } public DefaultImageCreator(){ } public DefaultImageCreator(String outputFilePath){ this.outputFilePath = outputFilePath; } @Override protected void drawString(Graphics graph, String text) { graph.setColor(getFontColor()); Font font = new Font(getFontName(), Font.PLAIN, getFontSize()); graph.setFont(font); FontMetrics fm = graph.getFontMetrics(font); int fontHeight = fm.getHeight(); //字符的高度 int offsetLeft = 0; int rowIndex = 1; for(int i=0;i<text.length();i++){ char c = text.charAt(i); int charWidth = fm.charWidth(c); //字符的寬度 //另起一行 if(Character.isISOControl(c) || offsetLeft >= (getWidth()-charWidth)){ rowIndex++; offsetLeft = 0; } graph.drawString(String.valueOf(c), offsetLeft, rowIndex * fontHeight); offsetLeft += charWidth; } } @Override protected void saveImage(BufferedImage image)throws IOException{ ImageIO.write(image, getFormatName(), new File(outputFilePath)); } }
3、類OutputStreamImageCreator的源代碼
該類將生成的圖片存儲到一個輸出流中,需要設置out成員變量值。
Java代碼
public class OutputStreamImageCreator extends DefaultImageCreator { private OutputStream out ; public OutputStream getOut() { return out; } public void setOut(OutputStream out) { this.out = out; } public OutputStreamImageCreator(){ } public OutputStreamImageCreator(OutputStream out){ this.out = out; } @Override public String getOutputFilePath() { return null; } @Override public void setOutputFilePath(String outputFilePath) { outputFilePath = null; } @Override protected void saveImage(BufferedImage image) throws IOException { if(out!=null) ImageIO.write(image, getFontName(), out); } }
三、實例代碼
1、圖片存儲到文件
StringBuffer sb = new StringBuffer();
sb.append("中華人民共和國\n"); sb.append("中華人民共和國\n"); DefaultImageCreator creator = new DefaultImageCreator("c:\\img.jpeg"); creator.setWidth(150); creator.setHeight(100); creator.setLineNum(60); creator.setFontSize(20); creator.drawImage(sb.toString());