首页 > 其他分享 >Easy-Captche的绘画方法

Easy-Captche的绘画方法

时间:2023-04-25 17:59:00浏览次数:51  
标签:strs int height 绘画 g2d besselXY 字体 Captche Easy

EasyCaptche 功能有 5个验证码类型,分别为

  • png类型
  • jpg类型
  • 中文类型
  • 中文jpg类型
  • 算数类型
    这5个对象中都会有graphicsImage() 方法,其功能是将内容画出来。

效果展示:
image

绘画方法:在画板上一点一点画

// 以下方法,为 SpecCaptcha 中的 out 方法体
private boolean graphicsImage(char[] strs, OutputStream out) {
        try {
            // 画板
            // 1. 使用缓存流用于 存储图片内容
            BufferedImage bi = new BufferedImage(this.width, this.height, 1);
            // 2. 使用 Graphics2D 进行绘图
            Graphics2D g2d = (Graphics2D)bi.getGraphics();
            // 背景颜色
            g2d.setColor(Color.WHITE);
            // 背景填范围
            g2d.fillRect(0, 0, this.width, this.height);
            // 模糊边缘程度
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            // 画一背景
            this.drawOval(2, g2d);
            // 设置画笔属性
            g2d.setStroke(new BasicStroke(2.0F, 0, 2));
            // 画线
            this.drawBesselLine(1, g2d);
            // 设置字体
            g2d.setFont(this.getFont());
            // 字体度量
            FontMetrics fontMetrics = g2d.getFontMetrics();
            // 单个字体所占宽度
            int fW = this.width / strs.length;
            // 单个字体空余宽度/2
            int fSp = (fW - (int)fontMetrics.getStringBounds("W", g2d).getWidth()) / 2;

            for(int i = 0; i < strs.length; ++i) {
                // 设置字体颜色
                g2d.setColor(this.color());
                // 字体距离顶部的距离
                int fY = this.height - (this.height - (int)fontMetrics.getStringBounds(String.valueOf(strs[i]), g2d).getHeight() >> 1);
                // 画字
                g2d.drawString(String.valueOf(strs[i]), i * fW + fSp + 3, fY - 3);
            }
            // 3. 停止绘画
            g2d.dispose();
            // 4. 生成绘画图片
            ImageIO.write(bi, "png", out);
            out.flush();
            boolean var20 = true;
            return var20;
        } catch (IOException var18) {
            var18.printStackTrace();
        } finally {
            try {
                out.close();
            } catch (IOException var17) {
                var17.printStackTrace();
            }
        }
        return false;
    }
ChineseGifCaptcha 中的 out 方法体
private BufferedImage graphicsImage(Color[] fontColor, char[] strs, int flag, int[][] besselXY) {
		// 1. 使用缓存流用于 存储图片内容
        BufferedImage image = new BufferedImage(this.width, this.height, 1);
		// 2. 使用 Graphics2D 进行绘图
        Graphics2D g2d = (Graphics2D)image.getGraphics();
		// 背景颜色
        g2d.setColor(Color.WHITE);
		// 背景填充访问
        g2d.fillRect(0, 0, this.width, this.height);
		// 模糊边缘程度
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
		// 设置透明度( 0.1F * (float)num(10))
        g2d.setComposite(AlphaComposite.getInstance(3, 0.1F * (float)num(10)));
		// 画两个圆
        this.drawOval(2, g2d);
		// 设置透明度( 0.7F)
        g2d.setComposite(AlphaComposite.getInstance(3, 0.7F));
		// 画笔属性
        g2d.setStroke(new BasicStroke(1.2F, 0, 2));
		// 画笔颜色
        g2d.setColor(fontColor[0]);
		// 三段曲线段
        CubicCurve2D shape = new Double((double)besselXY[0][0], (double)besselXY[0][1], (double)besselXY[1][0], (double)besselXY[1][1], (double)besselXY[2][0], (double)besselXY[2][1], (double)besselXY[3][0], (double)besselXY[3][1]);
		// 花曲线
        g2d.draw(shape);
		// 字体
        g2d.setFont(this.getFont());
		// 字体度量
        FontMetrics fontMetrics = g2d.getFontMetrics();
		// 单个字体所占宽度
        int fW = this.width / strs.length;
		// 单个字体空余宽度/2
        int fSp = (fW - (int)fontMetrics.getStringBounds("W", g2d).getWidth()) / 2;

        for(int i = 0; i < strs.length; ++i) {
			// 字体透明度
            AlphaComposite ac3 = AlphaComposite.getInstance(3, this.getAlpha(flag, i));
			
            g2d.setComposite(ac3);
			// 字体颜色
            g2d.setColor(fontColor[i]);
            // 字体距离顶部的距离
            int fY = this.height - (this.height - (int)fontMetrics.getStringBounds(String.valueOf(strs[i]), g2d).getHeight() >> 1);
			// 画字
            g2d.drawString(String.valueOf(strs[i]), i * fW + fSp - 3, fY - 3);
        }
		// 停止回话
        g2d.dispose();
        return image;
    }

通过以上代码,可以简单 captcha 图片的实现方式。对此,我们可以模仿写下 “给图片添加水印”,毕竟都是绘画功能。

水印的原理:在原图片上画上水印。使用的是 Graphics2D。

标签:strs,int,height,绘画,g2d,besselXY,字体,Captche,Easy
From: https://www.cnblogs.com/zz-1q/p/17344247.html

相关文章

  • EasyExcel库实现Excel解析
    以下是使用EasyExcel库实现Excel解析的示例代码:1、添加EasyExcel依赖在pom.xml文件中添加以下依赖:com.alibabaeasyexcel2.2.11定义实体类定义一个实体类,用于映射Excel文件中的每行数据。java@DatapublicclassUser{@ExcelProperty("姓名")privateStringname;@E......
  • [oeasy]python0140_导入_import_from_as_namespace_
    导入import回忆上次内容上次学习了tryexcept 注意要点半角冒号缩进输出错误信息 有错就报告不要隐瞒否则找不到出错位置还可以用traceback把系统报错信息原样输出  但是代码量好多啊10多行了......
  • 【正版软件推荐】Rebelle 6 仿真水墨水彩画制作绘画软件
    今天向大家推荐一款非常棒的绘画软件——Rebelle6仿真水墨水彩画制作绘画软件!Rebelle6是一款非常强大的数字绘画软件,它拥有极为先进的仿真功能,可以模拟出非常逼真的水墨、水彩画效果,使得数字绘画也可以达到非常逼真的效果,让您的绘画作品更加生动有趣!使用Rebelle6可以获得非常自......
  • [oeasy]python0139_尝试捕获异常_ try_except_traceback
    尝试捕获异常回忆上次内容变量相加整型数字变量可以相加字符串变量也可以拼接但是字符串和整型数字整型数字和字符串不能相加怎么办?转格式int("1")str(2)可是如果输入的苹果数量是字符串"abc"int("abc")会发生什么??......
  • [oeasy]python0139_尝试捕获异常_ try_except_traceback
                               -不但要有自己的报错-还要保留系统的报错-有可能吗?​###保留报错​![图片描述](https://doc.shiyanlou.com/courses/uid......
  • [oeasy]python0137_相加运算_python之禅_import_this_显式转化
    变量类型相加运算回忆上次内容上次讲了是从键盘输入变量input函数可以有提示字符串需要有具体的变量接收输入的字符串 输入单个变量没有问题但是输入两个变量之后一相加就非常离谱 ​ 添加图片注释,不超过140字(可选)......
  • abp(net core)+easyui+efcore实现仓储管理系统——组织管理升级之下(六十二)
    Abp(netcore)+easyui+efcore实现仓储管理系统目录abp(netcore)+easyui+efcore实现仓储管理系统——ABP总体介绍(一)abp(netcore)+easyui+efcore实现仓储管理系统——解决方案介绍(二)abp(netcore)+easyui+efcore实现仓储管理系统——领域层创建实体(三) abp(netcore)+eas......
  • SpringBoot+Mybatis-Plus+EasyExcel
    首先建立一个springboot项目,导入依赖<!--MyBatisPlus依赖--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.2</version......
  • [oeasy]python0136_接收输入_input函数_字符串_str
    输入变量回忆上次内容上次研究了一行赋值多个变量a=b=5a,b=7,8 还研究了标识符的惯用法python使用的是snake_case蛇形命名法用下划线分隔开小写字母的方法这样就可以更合理地命名变量了  变量变量能变的量......
  • [oeasy]python0136_接收输入_input函数_字符串_str
    输入变量回忆上次内容上次研究了一行赋值多个变量a=b=5a,b=7,8还研究了标识符的惯用法python使用的是snake_case蛇形命名法用下划线分隔开小写字母的方法这样就可以更合理地命名变量了变量变量能变的量我可以手工输入变量的值吗?......