wang123

用Java来显示图片生成器

一、本图片生成器具有以下功能特性:

     1、可以设置图片的宽度、高度、外框颜色、背景色;

     2、可以设置图片字体的大小、名称、颜色;

     3、可以设置输出图片的格式,如JPEG、GIF等;

     4、可以将图片存储到一个文件或者存储到一个输出流;

     5、可以为图片增加若干条干扰线(在生成随机码图片时可用此特性);

     6、打印在图片上的文字支持自动换行;

 

另外,本图片生成器还用到了模板方法模式。

 

二、下面列出相关的源代码

     1、抽象类AbstractImageCreator的源代码

 /**本代码在 http://www.bt285.cn  http://www.5a520.cn 已使用了 */
  1. public abstract class AbstractImageCreator {   
  2.     private static Random rnd = new Random(new Date().getTime());   
  3.        
  4.     //图片宽度   
  5.     private int width = 200;   
  6.        
  7.     //图片高度   
  8.     private int height = 80;   
  9.        
  10.     //外框颜色   
  11.     private Color rectColor;   
  12.        
  13.     //背景色   
  14.     private Color bgColor;   
  15.        
  16.     //干扰线数目   
  17.     private int lineNum = 0;   
  18.        
  19.     //图片格式   
  20.     private String formatName = "JPEG";   
  21.        
  22.     //字体颜色   
  23.     private Color fontColor = new Color(000);   
  24.        
  25.     //字体名称   
  26.     private String fontName = "宋体";   
  27.        
  28.     //字体大小   
  29.     private int fontSize = 15;   
  30.        
  31.   
  32.     //##### 这里省略成员变脸的get、set方法 #####   
  33.   
  34.   
  35.     /**  
  36.      * 画干扰线  
  37.      */  
  38.     private void drawRandomLine(Graphics graph){   
  39.         for(int i=0;i<lineNum;i++){   
  40.             //线条的颜色   
  41.             graph.setColor(getRandomColor(100155));   
  42.                
  43.             //线条两端坐标值   
  44.             int x1 = rnd.nextInt(width);   
  45.             int y1 = rnd.nextInt(height);   
  46.                
  47.             int x2 = rnd.nextInt(width);   
  48.             int y2 = rnd.nextInt(height);   
  49.                
  50.             //画线条   
  51.             graph.drawLine(x1, y1, x2, y2);   
  52.         }   
  53.     }   
  54.        
  55.     /**  
  56.      * 随机获取颜色对象  
  57.      */  
  58.     private Color getRandomColor(int base, int range){   
  59.         if((base + range) > 255) range = 255 - base;   
  60.            
  61.         int red = base + rnd.nextInt(range);   
  62.         int green = base + rnd.nextInt(range);   
  63.         int blue = base + rnd.nextInt(range);   
  64.            
  65.         return new Color(red, green, blue);   
  66.     }   
  67.            
  68.                 //该方法内应用了模板方法模式   
  69.     public void drawImage(String text)throws IOException{   
  70.         BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);   
  71.            
  72.         if(rectColor == null) rectColor = new Color(000);   
  73.         if(bgColor == null) bgColor = new Color(240251200);   
  74.            
  75.         //获取画布   
  76.         Graphics graph = image.getGraphics();   
  77.            
  78.         //画长方形   
  79.         graph.setColor(bgColor);   
  80.         graph.fillRect(00, width, height);   
  81.            
  82.         //外框   
  83.         graph.setColor(rectColor);   
  84.         graph.drawRect(00, width-1, height-1);   
  85.            
  86.         //画干扰线   
  87.         drawRandomLine(graph);   
  88.            
  89.         //画字符串   
  90.         drawString(graph, text);   
  91.            
  92.         //执行   
  93.         graph.dispose();   
  94.            
  95.         //输出图片结果   
  96.         saveImage(image);   
  97.     }   
  98.        
  99.     protected abstract void drawString(Graphics graph, String text);   
  100.        
  101.     protected abstract void saveImage(BufferedImage image)throws IOException;   
  102.        
  103. }  

 

     2、类DefaultImageCreator的源代码

          该类将生成的图片存储到一个文件中,需要设置outputFilePath成员变量值,该成员变量值表示图片的存储全路径。

Java代码 复制代码
  1. public class DefaultImageCreator extends AbstractImageCreator {   
  2.     private String outputFilePath;   
  3.        
  4.     public String getOutputFilePath() {   
  5.         return outputFilePath;   
  6.     }   
  7.   
  8.     public void setOutputFilePath(String outputFilePath) {   
  9.         this.outputFilePath = outputFilePath;   
  10.     }   
  11.        
  12.     public DefaultImageCreator(){   
  13.            
  14.     }   
  15.        
  16.     public DefaultImageCreator(String outputFilePath){   
  17.         this.outputFilePath = outputFilePath;   
  18.     }   
  19.   
  20.     @Override  
  21.     protected void drawString(Graphics graph, String text) {   
  22.         graph.setColor(getFontColor());   
  23.         Font font = new Font(getFontName(), Font.PLAIN, getFontSize());   
  24.         graph.setFont(font);   
  25.            
  26.         FontMetrics fm = graph.getFontMetrics(font);   
  27.         int fontHeight = fm.getHeight(); //字符的高度   
  28.            
  29.         int offsetLeft = 0;   
  30.         int rowIndex = 1;   
  31.         for(int i=0;i<text.length();i++){   
  32.             char c = text.charAt(i);   
  33.             int charWidth = fm.charWidth(c); //字符的宽度   
  34.   
  35.             //另起一行   
  36.             if(Character.isISOControl(c) || offsetLeft >= (getWidth()-charWidth)){   
  37.                 rowIndex++;   
  38.                 offsetLeft = 0;   
  39.             }   
  40.                
  41.             graph.drawString(String.valueOf(c), offsetLeft, rowIndex * fontHeight);   
  42.             offsetLeft += charWidth;   
  43.         }   
  44.     }   
  45.        
  46.     @Override  
  47.     protected void saveImage(BufferedImage image)throws IOException{   
  48.         ImageIO.write(image, getFormatName(), new File(outputFilePath));   
  49.     }   
  50.   
  51. }  

 

     3、类OutputStreamImageCreator的源代码

         该类将生成的图片存储到一个输出流中,需要设置out成员变量值。

Java代码 复制代码
  1. public class OutputStreamImageCreator extends DefaultImageCreator {   
  2.     private OutputStream out ;   
  3.        
  4.     public OutputStream getOut() {   
  5.         return out;   
  6.     }   
  7.   
  8.     public void setOut(OutputStream out) {   
  9.         this.out = out;   
  10.     }   
  11.        
  12.     public OutputStreamImageCreator(){   
  13.            
  14.     }   
  15.        
  16.     public OutputStreamImageCreator(OutputStream out){   
  17.         this.out = out;   
  18.     }   
  19.   
  20.     @Override  
  21.     public String getOutputFilePath() {   
  22.         return null;   
  23.     }   
  24.   
  25.     @Override  
  26.     public void setOutputFilePath(String outputFilePath) {   
  27.         outputFilePath = null;   
  28.     }   
  29.   
  30.     @Override  
  31.     protected void saveImage(BufferedImage image) throws IOException {   
  32.         if(out!=null) ImageIO.write(image, getFontName(), out);   
  33.     }   
  34.        
  35. }  

 

三、实例代码

     1、图片存储到文件

StringBuffer sb = new StringBuffer();   
  1. sb.append("中华人民共和国\n");   
  2. sb.append("中华人民共和国\n");   
  3.   
  4. DefaultImageCreator creator = new DefaultImageCreator("c:\\img.jpeg");   
  5. creator.setWidth(150);   
  6. creator.setHeight(100);   
  7. creator.setLineNum(60);   
  8. creator.setFontSize(20);   
  9. creator.drawImage(sb.toString());  

 

posted on 2009-03-23 18:49 阅读(2496) 评论(0)  编辑  收藏

<2009年3月>
22232425262728
1234567
891011121314
15161718192021
22232425262728
2930311234

导航

统计

常用链接

留言簿(3)

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜