Example #1
0
  public static Captcha get() {
    Builder builder = new Builder(75, 25);
    NoiseProducer[] nps =
        new NoiseProducer[] {
          new CurvedLineNoiseProducer(Color.decode("0x00FF00"), 1),
          // new CurvedLineNoiseProducer(Color.decode("0x008000"), 1),
        };
    for (NoiseProducer np : nps) builder.addNoise(np);
    List<Font> fl = new ArrayList<Font>();
    Font f1 = new Font("SansSerif", Font.PLAIN, 20);
    AffineTransform at = new AffineTransform();
    at.setToScale(1.5, 1);
    fl.add(f1.deriveFont(at));
    // fl.add(new Font("Courier", Font.BOLD, 28));
    List<Color> cl = new ArrayList<Color>();
    cl.add(Color.decode("0x800000"));
    // cl.add(Color.decode("0x008000"));
    // cl.add(Color.decode("0x000080"));
    // cl.add(Color.BLACK);
    WordRenderer wr = new DefaultWordRenderer(cl, fl);

    TextProducer tp = new DefaultTextProducer(4, CAPTCHA_CHARS);
    builder.addText(tp, wr);
    // BackgroundProducer bp = new GradiatedBackgroundProducer(Color.WHITE, Color.GRAY);
    BackgroundProducer bp = new FlatColorBackgroundProducer(Color.WHITE);
    builder.addBackground(bp);
    // 无渐进效果,只是填充背景颜色
    // FlatColorBackgroundProducer fbp = new FlatColorBackgroundProducer(Color.red);
    // 加入网纹--一般不会用
    // SquigglesBackgroundProducer sbp = new SquigglesBackgroundProducer();
    // 没发现有什么用,可能就是默认的
    // TransparentBackgroundProducer tbp = new TransparentBackgroundProducer();

    // 字体边框齿轮效果 默认是3
    // builder.gimp(new BlockGimpyRenderer(1));
    builder.gimp(new RippleGimpyRenderer());
    // 波纹渲染 相当于加粗
    // builder.gimp(new RippleGimpyRenderer());
    // 修剪--一般不会用
    // builder.gimp(new ShearGimpyRenderer(Color.red));
    // 加网--第一个参数是横线颜色,第二个参数是竖线颜色
    // builder.gimp(new FishEyeGimpyRenderer(Color.red,Color.yellow));
    // 加入阴影效果 默认3, 75
    // builder.gimp(new DropShadowGimpyRenderer());

    return builder.build();
  }
  /** 因为获取图片只会有get方法 */
  @Override
  public void doGet(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException {

    Builder builder = new Builder(_width, _height);
    // 增加边框
    builder.addBorder();
    // 是否增加干扰线条
    if (_noise == true) builder.addNoise();
    // ----------------自定义字体大小-----------
    // 自定义设置字体颜色和大小 最简单的效果 多种字体随机显示
    List<Font> fontList = new ArrayList<Font>();
    // fontList.add(new Font("Arial", Font.HANGING_BASELINE,
    // 40));//可以设置斜体之类的
    fontList.add(new Font("Courier", Font.BOLD, 60));
    DefaultWordRenderer dwr = new DefaultWordRenderer(Color.green, fontList);

    // 加入多种颜色后会随机显示 字体空心
    // List<Color> colorList=new ArrayList<Color>();
    // colorList.add(Color.green);
    // colorList.add(Color.white);
    // colorList.add(Color.blue);
    // ColoredEdgesWordRenderer cwr= new
    // ColoredEdgesWordRenderer(colorList,fontList);

    WordRenderer wr = dwr;
    // 增加文本,默认为5个随机字符.
    if (_text == null) {
      builder.addText();
    } else {
      String[] ts = _text.split(",");
      for (int i = 0; i < ts.length; i++) {
        String[] ts1 = ts[i].split(":");
        if ("chinese".equals(ts1[0])) {
          builder.addText(new ChineseTextProducer(Integer.parseInt(ts1[1])), wr);
        } else if ("number".equals(ts1[0])) {
          // 这里没有0和1是为了避免歧义 和字母I和O
          char[] numberChar = new char[] {'2', '3', '4', '5', '6', '7', '8'};
          builder.addText(new DefaultTextProducer(Integer.parseInt(ts1[1]), numberChar), wr);
        } else if ("word".equals(ts1[0])) {
          // 原理同上
          char[] numberChar =
              new char[] {
                'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'k', 'm', 'n', 'p', 'r', 'w', 'x', 'y'
              };
          builder.addText(new DefaultTextProducer(Integer.parseInt(ts1[1]), numberChar), wr);
        } else {
          builder.addText(new DefaultTextProducer(Integer.parseInt(ts1[1])), wr);
        }
      }
    }

    // --------------添加背景-------------
    // 设置背景渐进效果 以及颜色 form为开始颜色,to为结束颜色
    GradiatedBackgroundProducer gbp = new GradiatedBackgroundProducer();
    gbp.setFromColor(Color.yellow);
    gbp.setToColor(Color.red);
    // 无渐进效果,只是填充背景颜色
    // FlatColorBackgroundProducer fbp=new
    // FlatColorBackgroundProducer(Color.red);
    // 加入网纹--一般不会用
    // SquigglesBackgroundProducer sbp=new SquigglesBackgroundProducer();
    // 没发现有什么用,可能就是默认的
    // TransparentBackgroundProducer tbp = new
    // TransparentBackgroundProducer();

    builder.addBackground(gbp);
    // ---------装饰字体---------------
    // 字体边框齿轮效果 默认是3
    builder.gimp(new BlockGimpyRenderer(1));
    // 波纹渲染 相当于加粗
    // builder.gimp(new RippleGimpyRenderer());
    // 修剪--一般不会用
    // builder.gimp(new ShearGimpyRenderer(Color.red));
    // 加网--第一个参数是横线颜色,第二个参数是竖线颜色
    // builder.gimp(new FishEyeGimpyRenderer(Color.red,Color.yellow));
    // 加入阴影效果 默认3,75
    // builder.gimp(new DropShadowGimpyRenderer());
    // 创建对象
    Captcha captcha = builder.build();

    CaptchaServletUtil.writeImage(resp, captcha.getImage());
    req.getSession().setAttribute(NAME, captcha);
  }