zoukankan      html  css  js  c++  java
  • Gif验证码类

    package com.paic.bics.common.utils.vcode;
    import java.awt.AlphaComposite;
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics2D;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    import java.io.OutputStream;
    /**
     * <p>Gif验证码类</p>
     
     * @version:1.0
     */
    public class GifCaptcha extends Captcha
    {
        public GifCaptcha()
        {
        }
    
        public GifCaptcha(int width,int height){
            this.width = width;
            this.height = height;
        }
    
        public GifCaptcha(int width,int height,int len){
            this(width,height);
            this.len = len;
        }
    
        public GifCaptcha(int width,int height,int len,Font font)
        {
            this(width,height,len);
            this.font = font;
        }
    
        @Override
        public void out(OutputStream os)
        {
            try
            {
                GifEncoder gifEncoder = new GifEncoder();   // gif编码类,这个利用了洋人写的编码类,所有类都在附件中
                //生成字符
                gifEncoder.start(os);
                gifEncoder.setQuality(180);
                gifEncoder.setDelay(100);
                gifEncoder.setRepeat(0);
                BufferedImage frame;
                char[] rands =alphas();
                Color fontcolor[]=new Color[len];
                for(int i=0;i<len;i++)
                {
                    fontcolor[i]=new Color(20 + num(110), 20 + num(110), 20 + num(110));
                }
                for(int i=0;i<len;i++)
                {
                    frame=graphicsImage(fontcolor, rands, i);
                    gifEncoder.addFrame(frame);
                    frame.flush();
                }
                gifEncoder.finish();
            }finally
            {
                try {
                    os.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
    
        }
    
        /**
         * 画随机码图
         * @param fontcolor 随机字体颜色
         * @param strs 字符数组
         * @param flag 透明度使用
         * @return BufferedImage
         */
        private BufferedImage graphicsImage(Color[] fontcolor,char[] strs,int flag)
        {
            BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);
            //或得图形上下文
            //Graphics2D g2d=image.createGraphics();
            Graphics2D g2d = (Graphics2D)image.getGraphics();
            //利用指定颜色填充背景
            g2d.setColor(Color.WHITE);
            g2d.fillRect(0, 0, width, height);
            AlphaComposite ac3;
            int h  = height - ((height - font.getSize()) >>1) ;
            int w = width/len;
            g2d.setFont(font);
            for(int i=0;i<len;i++)
            {
                ac3 = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, getAlpha(flag, i));
                g2d.setComposite(ac3);
                g2d.setColor(fontcolor[i]);
                g2d.drawOval(num(width), num(height), 5+num(10), 5+num(10));
                g2d.drawString(strs[i]+"", (width-(len-i)*w)+(w-font.getSize())+1, h-4);
            }
            g2d.dispose();
            return image;
        }
    
        /**
         * 获取透明度,从0到1,自动计算步长
         * @return float 透明度
         */
        private float getAlpha(int i,int j)
        {
            int num = i+j;
            float r = (float)1/len,s = (len+1) * r;
            return num > len ? (num *r - s) : num * r;
        }
    
    }
  • 相关阅读:
    UI: 操作导航控制器的视图控制器数组
    UI: 使用 UIViewController 展现和管理视图
    UI: 使用 UINavigationController 实现导航
    UI: 使用 UIActivityViewController 显示分享选项
    UI: 使用 UIActivityViewController 显示分享选项
    UI: 自定义 UISegmentedControl
    UI: UISegmentedControl 做简单选项分组及其自定义
    UI: UISlider 实现指定范围值的选择
    隧道目标识别实验过程(二)标准VOC数据集和制作后的数据集实验结果对比
    隧道目标识别实验过程(一)数据集的制作
  • 原文地址:https://www.cnblogs.com/shibazizhan/p/7240954.html
Copyright © 2011-2022 走看看