以下下是API文档对Graphics的介绍!

Graphics 类是所有图形上下文的抽象基类,允许应用程序在组件(已经在各种设备上实现)以及闭屏图像上进行绘制。

Graphics 对象封装了 Java 支持的基本呈现操作所需的状态信息。此状态信息包括以下属性:

  • 要在其上绘制的 Component 对象。
  • 呈现和剪贴坐标的转换原点。
  • 当前剪贴区。
  • 当前颜色。
  • 当前字体。
  • 当前逻辑像素操作函数(XOR 或 Paint)。
  • 当前 XOR 交替颜色(参见 setXORMode(java.awt.Color))。

坐标是无限细分的,并且位于输出设备的像素之间。绘制图形轮廓的操作是通过使用像素大小的画笔遍历像素间无限细分路径的操作,画笔从路径上的锚点向下和向右绘制。填充图形的操作是填充图形内部区域无限细分路径操作。呈现水平文本的操作是呈现字符字形完全位于基线坐标之上的上升部分。

图形画笔从要遍历的路径向下和向右绘制。其含义如下:

  • 如果绘制一个覆盖给定矩形的图形,那么该图形与填充被相同矩形所限定的图形相比,在右侧和底边多占用一行像素。
  • 如果沿着与一行文本基线相同的 y 坐标绘制一条水平线,那么除了文字的所有下降部分外,该线完全画在文本的下面。

所有作为此 Graphics 对象方法的参数而出现的坐标,都是相对于调用该方法前的此 Graphics 对象转换原点的。

所有呈现操作仅修改当前剪贴区所限定区域内的像素,此剪贴区是由用户空间中的 Shape 指定的,并通过使用 Graphics 对象的程序来控制。此用户剪贴区 被转换到设备空间中,并与设备剪贴区 组合,后者是通过窗口可见性和设备范围定义的。用户剪贴区和设备剪贴区的组合定义复合剪贴区,复合剪贴区确定最终的剪贴区域。用户剪贴区不能由呈现系统修改,以反映得到的复合剪贴区。用户剪贴区只能通过 setClipclipRect 方法更改。所有的绘制或写入都以当前的颜色、当前绘图模式和当前字体完成。

图形验证码多用于网页上用户验证以防止非注册用户使用暴力破解法获取密码或者批量注册!用java Graphics生成图形验证码还是非常简单的下面我们看一下代码!

主要代码是放在servlet的GEt方法中的

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

response.setContentType("image/jpeg");
HttpSession session = request.getSession();
int width =100;
int height=40;
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
//创建内存图像并获得其图形上下文
BufferedImage image =new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
//产生随机码
//定义随机码的字符表
String chars="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
char[] rands = new char[4];
for(int i=0;i<4;i++){
int rand =(int)(Math.random()*36);
rands[i] =chars.charAt(rand);

//产生 图像
//画出背景

}

g.setColor(new Color(0xDCDCDC));
g.fillRect(0, 0, width, height);
for(int i=0;i<500;i++){
int x=(int)(Math.random()*width);
int y=(int)(Math.random()*height);
int red=(int)(Math.random()*255);
int green=(int)(Math.random()*255);
int blue=(int)(Math.random()*255);
g.setColor(new Color(red,green,blue));
g.drawOval(x, y, 1, 0);
}
g.setColor(Color.BLACK);
g.setFont(new Font(null,Font.ITALIC,30));
//在不同高度上输出验证码的不同字符
g.drawChars(rands, 0, 1, 1, 35);
g.drawChars(rands,1,1, 24, 30);
g.drawChars(rands,2,1, 42, 25);
g.drawChars(rands,3,1, 57, 32);
//g.drawChars(rands,4,1, 61, 19);
//g.drawChars(rands,5,1, 76, 22);
g.dispose();
//将图像输出到客户端
ServletOutputStream sos = response.getOutputStream();
ByteArrayOutputStream baos =new ByteArrayOutputStream();
ImageIO.write(image,"JPEG",baos);
byte[] buffer = baos.toByteArray();
response.setContentLength(buffer.length);
sos.write(buffer);
baos.close();
sos.close();
//将验证码放到 session 中
session.setAttribute("checkCode", new String(rands));
}

这个只是众多生成验证码方法中的其中一种,而且相对简单!其实利用Graphics类可以生成更复杂的验证码,朋友们可以自己试一试!

用java Graphics生成验证码的更多相关文章

  1. java中生成验证码,以及验证码的使用

    java中生成验证码,以及验证码的使用: 1:验证码生成工具类: import java.awt.Color; import java.awt.Font; import java.awt.Graphi ...

  2. Java基础--生成验证码

    HTML <%@ page language="java" contentType="text/html; charset=UTF-8" pageEnco ...

  3. java随机生成验证码

    package com.yuyuchen.util; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; im ...

  4. java动态生成验证码图片

    package cn.lijun.checkimg; import java.awt.image.BufferedImage;import java.io.BufferedReader; import ...

  5. Java生成验证码原理(jsp)

     验证码的作用: 验证码是Completely Automated Public Turing test to tell Computers and Humans Apart(全自动区分计算机和人类的 ...

  6. java生成验证码结合springMVC

    在用户登录的时候,为了防止机器人攻击都会设置输入验证码,本篇文章就是介绍java如何生成验证码并使用在springMVC项目中的. 第一步:引入生成图片验证码的工具类 import java.awt. ...

  7. java web学习总结(九) -------------------通过Servlet生成验证码图片

    一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下:

  8. java web 学习九(通过servlet生成验证码图片)

    一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下:

  9. java web,生成验证码图片的技术

    偶然知道原来有些网站的验证码图片都是随机生成的,后来听人讲了一下,就做了这个小例子 生成图片,绘制背景,数字,干扰线用到了java.awt包,主要使用BufferedImage来生成图片,然后使用Gr ...

随机推荐

  1. JS面向对象方法(一): 使用原生JS 实现导航栏下多级分类弹出效果

    利用二级菜单的onmouseover/out事件 重新构建一级菜单 ".hover" 样式类 代码如下: CSS部分: 在原来的目标:hover样式中 增加 .hover状态 li ...

  2. PHP 字符 正则表达式 +,*,?

    1.“/”是定界符,“/”定界符之间的部分就是将要在目标对象中进行匹配的模式.同时为了正则更加灵活,引入了元字符,即“+”, “*”,以及 “?”. (1)“+”元字符规定其前导字符必须在目标对象中连 ...

  3. hihocoder #1190 : 连通性·四 点双联通分量

    http://hihocoder.com/problemset/problem/1190?sid=1051696 先抄袭一下 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描 ...

  4. IOS弹出视图preferredContentSize

    UIViewController.preferredContentSize代理旧方法 contentSizeForViewInPopover. self.contentSizeForViewInPop ...

  5. MongoDB数据清理命令

    #启动mongo命令/data/liudi/mongodb/bin/mongo --port 27010 #显示数据库show dbs; #使用tps_live数据库use tps_live; #显示 ...

  6. C#语言 数据类型 类型转换

    数据类型有  基本数据类型 和  引用数据类型 两大类型. 数据类型 C#语言 .NET(通用语言) 大小(字节) 值区间 基本数据类型 值类型 整型 不能存在小数点,可以有负数 byte Byte ...

  7. SAP云平台,Netweaver,Kubernetes和C4C的用户和角色关系

    SAP云平台 Netweaver 同SAP云平台一样,在事务码PFCG里维护角色: 然后在事务码SU01里将多个角色分配给用户: Kubernetes Kubernetes在1.3版本中发布了alph ...

  8. 在ABAP里模拟实现Java Spring的依赖注入

    Dependency Injection- 依赖注入,在Java Spring框架中有着广泛地应用.通过依赖注入,我们不必在应用代码里繁琐地初始化依赖的资源,非常方便. 那么ABAP能否从语言层面上也 ...

  9. Web项目之Django实战问题剖析

    基于AdminLTE-master模板的后台管理系统 左侧菜单栏的二级标签设计 面包屑 Django文件上传 后台管理系统CRM项目设计流程分析

  10. PAT (Basic Level) Practise (中文)-1027. 打印沙漏(20)

    PAT (Basic Level) Practise (中文)-1027. 打印沙漏(20)  http://www.patest.cn/contests/pat-b-practise/1027 本题 ...