黑马程序员技术交流社区

标题: 生成验证码中的背景、字体颜色设置问题 [打印本页]

作者: 段光宇    时间: 2013-11-20 19:18
标题: 生成验证码中的背景、字体颜色设置问题
生成一个验证码时,图像中要绘制背景颜色、字符、直线、点等一系列内容,而且要给它们分别绘制颜色,分别用setColor函数给它们绘制了,可我不明白的一点是: 第一次填充图形时,setColor函数绘制了背景颜色,可后来对同一对象多次运用了setColor函数,为什么第二次就是绘制直线、接着绘制点呢?setColor是怎么识别我要绘制的东西呢?
代码:
  1. package com.itheima;

  2. import java.awt.Color;
  3. import java.awt.Font;
  4. import java.awt.Graphics;
  5. import java.awt.image.BufferedImage;
  6. import java.io.File;
  7. import java.util.Random;

  8. import javax.imageio.ImageIO;

  9. public class CreateCodeImage {
  10.         //随机颜色生成函数
  11.         public static Color getcolor(int a,int b){
  12.                 Random r = new Random();
  13.                 if(a>255) a=255;
  14.                 if(b>255) b=255;
  15.                 int red=a+r.nextInt(b-a);
  16.                 int green=a+r.nextInt(b-a);
  17.                 int blue=a+r.nextInt(b-a);
  18.                 return new Color(red,green,blue);//返回RGB颜色
  19.         }
  20.         public static void createimage(){
  21.                 String code[] = { "A", "a", "B", "b", "C", "c", "D", "d", "E", "e", "F", "f", "G", "g", "H", "h", "I", "i", "J", "j", "K", "k", "L", "l", "M", "m", "N", "n", "O", "o", "P", "p", "Q", "q",
  22.                              "R", "r", "S", "s", "T", "t", "U", "u", "V", "v", "W", "w", "X", "x", "Y", "y", "Z", "z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "1", "2", "3", "4", "5", "6", "7",
  23.                              "8", "9", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"};
  24.                         Random r = new Random();
  25.                         int width=60,height=20;
  26.                         BufferedImage pic=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);//新建图片对象
  27.                         Graphics g = pic.getGraphics();//得到图形的上下文环境
  28.                         g.setColor(getcolor(200,250));//第一次设置图形的填充颜色
  29.                         g.fillRect(0,0,width,height);//填充矩形区域
  30.                         g.setFont(new Font("Times New Roman",Font.PLAIN,18));//设置图形中的字体样式
  31.                         //图形中随机绘出100条干扰直线
  32.                         g.setColor(getcolor(160,200));//第二次设置直线颜色
  33.                         for (int i=0;i<100;i++){
  34.                                 int x1 = r.nextInt(width);
  35.                                 int y1 = r.nextInt(height);
  36.                                 int x2 = r.nextInt(15);
  37.                                 int y2 = r.nextInt(15);
  38.                                 g.drawLine(x1,y1,x1+x2,y1+y2);
  39.                         }
  40.                         //图形中随机绘出100个干扰点
  41.                         g.setColor(getcolor(120,240));//第三次设置点的颜色,setColor函数怎么识别的三次不同的绘制对象?
  42.                         for (int i=0;i<100;i++){
  43.                                 int x = r.nextInt(width);
  44.                                 int y = r.nextInt(height);
  45.                                 g.drawOval(x,y,0,0);
  46.                         }
  47.                         //随机生成4位验证码
  48.                         String rn="";
  49.                         for(int i=0;i<4;i++){
  50.                                 rn=code[r.nextInt(91)];
  51.                                 g.setColor(new Color(20+r.nextInt(110),20+r.nextInt(110),20+r.nextInt(110)));
  52.                                 g.drawString(rn,13*i+6,16);
  53.                         }
  54.                         g.dispose();//释放资源
  55.                         File file =new File("d://CodeImage.jpg");
  56.                         if(file.exists()){
  57.                                 file.delete();
  58.                                 try {
  59.                                         file.createNewFile();
  60.                                         ImageIO.write(pic, "jpg", file);
  61.                                         System.out.println("验证码图片已创建!");
  62.                                 } catch (Exception e) {
  63.                                         e.printStackTrace();
  64.                         }}
  65.                         else{
  66.                                 try {
  67.                                         file.createNewFile();
  68.                                         ImageIO.write(pic, "jpg", file);
  69.                                         System.out.println("验证码图片已创建!");
  70.                                 } catch (Exception e) {
  71.                                         e.printStackTrace();
  72.                                 }
  73.                         }
  74.         }
  75.         public static void main(String args[]){
  76.                 createimage();
  77.         }
  78. }
复制代码

作者: 段光宇    时间: 2013-11-20 21:21
求回答啊
作者: hurryup    时间: 2013-11-20 22:16
楼主的代码是网上的?肯定没仔细看。
g.fillRect(0,0,width,height);//填充矩形区域,这是设置背景色
g.drawLine(x1,y1,x1+x2,y1+y2);//这是画直线方法
g.drawOval(x,y,0,0);//这是绘制点的方法




作者: 段光宇    时间: 2013-11-20 22:31
hurryup 发表于 2013-11-20 22:16
楼主的代码是网上的?肯定没仔细看。
g.fillRect(0,0,width,height);//填充矩形区域,这是设置背景色
g.dra ...

不是这个意思,这我知道,我问的是setColor方法明明是一样的,但是它三次执行的效果是不同的,这是怎么回事
作者: 侠客梦的懒猫    时间: 2013-11-20 23:23
g.setColor(getcolor(120,240));是一样没错,但是注意他调用的方法,getcolor我们找到getcolor()
发现他中有一个  Random r = new Random();产生伪随机数,这样使得r,g,b的值都不确定了,所以颜色就不一样啦{:soso_e100:}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2