图片验证码给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();

    }
}



原文地址:https://www.cnblogs.com/hd-zg/p/8902468.html