• 图片验证码给AI使用


    为了破解图形验证码,AI需要大量的图片数据。为了简单获取大量的图形来喂给Ai模型训练,索性自己写一把。代码来一发。。

     
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.image.BufferedImage;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.util.Random;
    
    import org.patchca.background.BackgroundFactory;
    import org.patchca.color.ColorFactory;
    import org.patchca.filter.predefined.CurvesRippleFilterFactory;
    import org.patchca.filter.predefined.DiffuseRippleFilterFactory;
    import org.patchca.filter.predefined.DoubleRippleFilterFactory;
    import org.patchca.filter.predefined.MarbleRippleFilterFactory;
    import org.patchca.filter.predefined.WobbleRippleFilterFactory;
    import org.patchca.font.RandomFontFactory;
    import org.patchca.service.ConfigurableCaptchaService;
    import org.patchca.text.renderer.BestFitTextRenderer;
    import org.patchca.utils.encoder.EncoderHelper;
    import org.patchca.word.RandomWordFactory;
    
    /**
     * 验证码工具
     */
    public class CaptchaUtils {
    
        private static Random random = new Random();
        private static ConfigurableCaptchaService ccs;
        private static WobbleRippleFilterFactory wrff;     // 摆波纹
        private static DoubleRippleFilterFactory doff;     // 双波纹
        private static CurvesRippleFilterFactory crff;     // 曲线波纹
        private static DiffuseRippleFilterFactory drff; // 漫纹波
        private static MarbleRippleFilterFactory mrff;     // 大理石
        
        private static void initialize(){
            if (ccs == null){
                synchronized (CaptchaUtils.class) {
                    if (ccs == null){
                        // 配置初始化
                        ccs = new ConfigurableCaptchaService();
                        
                        // 设置图片大小
                        ccs.setWidth(100);
                        ccs.setHeight(28);
                        
                        // 设置文字数量
                        RandomWordFactory wf = new RandomWordFactory();
                        wf.setCharacters("ABDEFGHKMNRSWX2345689");
                        wf.setMinLength(4);
                        wf.setMaxLength(4);
                        ccs.setWordFactory(wf);
                        
                        // 设置字体大小
                        RandomFontFactory ff = new RandomFontFactory();
                        ff.setMinSize(28);
                        ff.setMaxSize(28);
                        ccs.setFontFactory(ff);
                        
                        // 设置文字渲染边距
                        BestFitTextRenderer tr = new BestFitTextRenderer();
                        tr.setTopMargin(3);
                        tr.setRightMargin(3);
                        tr.setBottomMargin(3);
                        tr.setLeftMargin(3);
                        ccs.setTextRenderer(tr);
                        
                        // 设置字体颜色
                        ccs.setColorFactory(new ColorFactory() {
                            @Override
                            public Color getColor(int x) {
                                int r = random.nextInt(90);
                                int g = random.nextInt(90);
                                int b = random.nextInt(90);
                                return new Color(r, g, b);
                            }
                        });
                        
                        // 设置背景
                        ccs.setBackgroundFactory(new BackgroundFactory() {
                            @Override
                            public void fillBackground(BufferedImage image) {
                                Graphics graphics = image.getGraphics();
                                // 验证码图片的宽高
                                int imgWidth = image.getWidth();
                                int imgHeight = image.getHeight();
                                // 填充为白色背景
                                graphics.setColor(Color.WHITE);
                                graphics.fillRect(0, 0, imgWidth, imgHeight);
                                // 画 50 个噪点(颜色及位置随机)
                                for (int i = 0; i < 50; i++) {
                                    // 随机颜色
                                    int rInt = random.nextInt(100)+50;
                                    int gInt = random.nextInt(100)+50;
                                    int bInt = random.nextInt(100)+50;
                                    graphics.setColor(new Color(rInt, gInt, bInt));
                                    // 随机位置
                                    int xInt = random.nextInt(imgWidth - 3);
                                    int yInt = random.nextInt(imgHeight - 2);
                                    // 随机旋转角度
                                    int sAngleInt = random.nextInt(360);
                                    int eAngleInt = random.nextInt(360);
                                    // 随机大小
                                    int wInt = random.nextInt(6);
                                    int hInt = random.nextInt(6);
                                    // 填充背景
                                    graphics.fillArc(xInt, yInt, wInt, hInt, sAngleInt, eAngleInt);
                                    // 画5条干扰线
                                    if (i % 10 == 0) {
                                        int xInt2 = random.nextInt(imgWidth);
                                        int yInt2 = random.nextInt(imgHeight);
                                        graphics.drawLine(xInt, yInt, xInt2, yInt2);
                                    }
                                }
                            }
                        });
                        
                        // 效果初始化
                        wrff = new WobbleRippleFilterFactory();     // 摆波纹
                        doff = new DoubleRippleFilterFactory();     // 双波纹
                        crff = new CurvesRippleFilterFactory(ccs.getColorFactory()); // 曲线波纹
                        drff = new DiffuseRippleFilterFactory();     // 漫纹波
                        mrff = new MarbleRippleFilterFactory();     // 大理石
                        
                    }
                }
            }
        }
    
        /**
         * 生成验证码
         * @param request
         * @param response
         * @throws IOException
         * @return 验证码字符
         */
        public static String generateCaptcha(OutputStream outputStream) throws IOException{
            
            // 初始化设置
            initialize();
            
            // 随机选择一个样式
            switch (random.nextInt(3)) {
            case 0:
                ccs.setFilterFactory(wrff); // 摆波纹
                break;
            case 1:
                ccs.setFilterFactory(doff); // 双波纹
                break;
            case 2:
                ccs.setFilterFactory(crff); // 曲线波纹
                break;
            case 3:
                ccs.setFilterFactory(drff); // 漫纹波
                break;
            case 4:
                ccs.setFilterFactory(mrff); // 大理石
                break;
            }
            
            // 生成验证码
            String s = EncoderHelper.getChallangeAndWriteImage(ccs, "png", outputStream);
    //        System.out.println(s);
            
            return s;
        }
    
        public static void main(String[] args) throws IOException {
    
            FileOutputStream fos = new FileOutputStream("d:\captcha.png");
            String s = generateCaptcha(fos);
            System.out.println(s);
            fos.close();
    
        }
    }



  • 相关阅读:
    MySQL 4.1x 中文乱码效果
    linux内核中的“捏造化”
    Ubuntu开发者峰会在布拉格举行
    Decode 函数的用法
    Solaris 10拆卸jdk1.6及点窜成默许JDK
    教你编写高机能的mysql语法
    DirectShow9.0在vs2005中存在的问题解决
    Unicode,unicoidebig,Asci,UTF8文件read和write
    自已写了个GDI类,实现了相对路径载入任意类型的图片函数,并加一个在CRECT矩形上贴图的函数(5月25日写)
    两种解析EDIT控件上文本的方式
  • 原文地址:https://www.cnblogs.com/hd-zg/p/8902468.html
Copyright © 2020-2023  润新知