Este artigo compartilha a versão Java do código de verificação de imitação de imitação do código de verificação QQ para todos. O conteúdo específico é o seguinte
Os recursos incluem: Tamanho da imagem personalizado e comprimento do caractere, cor aleatória de fundo e cor de caractere, ângulo de deslocamento de caracteres aleatório, borda lisa do caractere, linhas de interferência, ruído, distorção de fundo.
Originalmente, eu queria fazer os personagens distorcidos, mas não sei por que o professor escreveu o texto e depois relatou o erro. Vamos fazer isso por enquanto. Espero que um mestre possa ajudar a corrigi -lo.
Deve -se notar que a razão pela qual há um pouco como o código de verificação QQ é por causa dessa fonte argelina. Se o sistema não tiver um, você precisará instalá -lo sozinho. Você pode baixar o nome da fonte no Baidu e apenas jogar fora a pasta do System Fontes.
Imagem de reprodução:
pacote hh.com.util; importar java.io.ioException; importar javax.servlet.servletexception; importar javax.servlet.http.httpServletRequest; importar javax.servlet.http.httpServletResponse; importar javax.servlet.http.httpServletResponse; importar javax.servlet.http.httpSession; A authimage da classe pública estende javax.servlet.http.httpServlet implementa Javax.Servlet.Servlet {estática final serialversionuid = 1L; Serviço public void (solicitação httpServletRequest, resposta httpServletResponse) lança servletexception, ioexception {Response.setheader ("Pragma", "sem cache"); Response.setheader ("Cache-Control", "No-Cache"); Response.SetDateHeader ("Expira", 0); Response.setContentType ("Image/jpeg"); // gerar string aleatória string verifyCode = verifyCodeutils.geReReverifyCode (4); // Salvar sessão de sessão HTTPSession Session = request.getSession (true); session.setAttribute ("rand", verifycode.tolowercase ()); // gerar imagem int w = 200, h = 80; VerifyCodeutils.OutputImage (W, H, Response.getOutputStream (), VerifyCode); }} Verifique a classeCodeutils
pacote hh.com.util; importar java.awt.color; importar java.awt.font; importar java.awt.graphics; importar java.awt.graphics2d; importar java.awt.LinearGradientPaint; importar java.awt.paint; importação.awt.enderingpaint; importação; java.awt.image.bufferedImage; importar java.io.file; importar java.io.fileOutputStream; importar java.io.ioException; importar java.io.outputStream; import java.util.arrays; importar java.util.random; importar javax.imageio.imageio; classe pública VerifyCodeutils {// Use a fonte argelina, se não estiver no sistema, a fonte exibe apenas a capitalização e remove vários caracteres facilmente confundidos de 1,0, i, o public static final string verify_codes = "23456789abcdhjklmnnpqrStuvwxzzzzzzzzzzzzzzzzzna"; Randomal aleatório estático privado = novo aleatório (); / *** Use a fonte de caractere padrão do sistema para gerar código de verificação* @param verifysize o comprimento do código de verificação* @return*/ public static string GeneratemverycyCode (int verifySize, verify_codes); } / *** Use a fonte especificada para gerar código de verificação* @param VerifySize Comprimento do código de verificação* @param fontes Código de verificação Fonte do caractere* @return* / public static string generathycode (int verifysize, fontes de string) {if (fontes == null || fontes.Length () == 0) { } int codeslen = fontes.length (); Rand aleatório = novo aleatório (System.CurrentTimemillis ()); StringBuilder verifyCode = new StringBuilder (verifysize); for (int i = 0; i <verifysize; i ++) {verifyCode.append (fontes.charat (rand.nextint (codeslen-1))); } return verifyCode.toString (); } / ** * Gere um arquivo de código de verificação aleatório e retorne o valor do código de verificação * @param w * @param h * @param outputFile * @param verifysize * @return * @throws ioexception * / public static stringImEcrifExeImage (int w, int h, arquivo de saída, intifySize) (string de stringsEception {string, string, int h, arquivo de saída, intifySize)) outputImage (w, h, outputFile, verifyCode); retornar verifyCode; } / ** * Saída do fluxo de imagem do código de verificação aleatório e retorne o valor do código de verificação * @param w * @param h * @param os * @param verifySize * @return * @throws ioexception * / public static string ousifyImage (int w, int h, outifSoDe); outputImage (W, H, OS, VerifyCode); retornar verifyCode; } / ** * Gere o arquivo de imagem do código de verificação especificado * @param w * @param h * @param outputFile * @param Código * @THOWSows IoException * / public static void Outputimage (int w, int h, arquivo de saída, código de string) lança ioexception {if (outputFile == Null) {Return; Return; } Arquivo dir = outputfile.getParentFile (); if (! Dir.Exists ()) {Dir.mkdir (); } tente {outputfile.createNewFile (); FileOutputStream fos = new FileOutputStream (outputFile); outputImage (w, h, fos, código); fos.close (); } catch (ioexception e) {tiro e; }} / ** * Saída Código de verificação especificado Stream de imagem * @param w * @param h * @param os * @param code * @throws ioexception * / public static void outputimage (int w, int h, outpulStream, código string) lança IoException {int verifysize = code.LUNTE (); BufferImage imagem = new bufferImage (w, h, bufferImage.type_int_rgb); Rand aleatório = novo aleatório (); Graphics2d g2 = image.creategraphics (); g2.SetRanderingHint (renderinghints.key_antialiasing, renderinghints.value_antialias_on); Cor [] cores = nova cor [5]; Color [] colorspaces = nova cor [] {color.white, color.cyan, color.gray, color.light_gray, color.magenta, color.orange, color.pink, color.yellow}; flutuar [] frações = novo float [colors.length]; for (int i = 0; i <colors.length; i ++) {colors [i] = colorspaces [rand.nextint (colorspaces.length)]; frações [i] = rand.nextfloat (); } Arrays.sort (frações); g2.SetColor (color.gray); // Defina a cor da borda G2.FillRect (0, 0, W, H); Cor c = getrandcolor (200, 250); g2.SetColor (c); // Definir cores de fundo G2.FillRect (0, 2, W, H-4); // Desenhe linha de interferência aleatória aleatória = novo aleatório (); g2.setColor (getrandcolor (160, 200)); // Defina a cor da linha para (int i = 0; i <20; i ++) {int x = aleatom.nextInt (w - 1); int y = random.nextInt (h - 1); int xl = random.nextInt (6) + 1; int yl = random.nextint (12) + 1; g2.drawline (x, y, x + xl + 40, y + yl + 20); } // Adicione o ruído float yawprate = 0,05f; // taxa de ruído int areia = (int) (yawprate * w * h); for (int i = 0; i <área; i ++) {int x = aleatom.nextInt (w); int y = random.nextint (h); int rgb = getRandomintColor (); image.setrgb (x, y, rgb); } cisalhamento (g2, w, h, c); // distorce a figura g2.setColor (getrandcolor (100, 160)); int fontsize = h-4; Fonte da fonte = nova fonte ("argeliano", font.italic, fontsize); g2.setFont (fonte); char [] chars = code.toCharArray (); for (int i = 0; i <verifysize; i ++) {affineTransform affine = new AffineTransform (); afine.Settortorotation (Math.pi / 4 * rand.nextDouble () * (rand.nextboolean ()? 1: -1), (w / verifysize) * i + fontsize / 2, h / 2); G2.Settransform (affine); g2.drawchars (chars, i, 1, ((w -10)/verifysize) * i + 5, h/2 + fontsize/2 - 10); } g2.dispose (); Imageio.Write (Image, "JPG", OS); } color estática privada getrandcolor (int fc, int bc) {if (fc> 255) fc = 255; if (bc> 255) bc = 255; int r = fc + aleatoriamente.nextInt (bc - fc); int g = fc + aleatoriamente.nextInt (bc - fc); int b = fc + aleatoriamente.nextInt (bc - fc); retornar nova cor (R, G, B); } private static int getRandomintColor () {int [] rgb = getRandomrgb (); int cor = 0; for (int c: rgb) {color = cor << 8; cor = cor | c; } retornar a cor; } private static int [] getrandomrgb () {int [] rgb = new int [3]; for (int i = 0; i <3; i ++) {rgb [i] = aleatória.nextint (255); } retornar rgb; } cisalhamento de vazio estático privado (gráficos G, int w1, int h1, cor cor) {shearx (g, w1, h1, cor); Sheary (G, W1, H1, cor); } private estático void shearx (gráficos G, int w1, int h1, cor da cor) {int period = Random.nextInt (2); BorderGap booleano = true; Int quadros = 1; int fase = random.nextint (2); para (int i = 0; i <h1; i ++) {duplo d = (duplo) (período >> 1) * math.sin ((duplo) i / (duplo) período+(6.2831853071795862d * (dupla) quadros) / (duplo)); g.copyarea (0, i, w1, 1, (int) d, 0); if (bordergap) {g.setColor (cor); g.Drawline ((int) d, i, 0, i); g.Drawline ((int) d + w1, i, w1, i); }}} private estático void sheary (gráficos G, int w1, int h1, cor de cor) {int periou = aleatom.nextint (40) + 10; // 50; BorderGap booleano = true; INT quadros = 20; int fase = 7; para (int i = 0; i <w1; i ++) {duplo d = (duplo) (período >> 1) * math.sin ((duplo) i / (duplo) período+(6.2831853071795862d * (duplo) quadros) / (duplo)); g.copyarea (i, 0, 1, h1, 0, (int) d); if (bordergap) {g.setColor (cor); G.Drawline (i, (int) d, i, 0); G.Drawline (i, (int) d + h1, i, h1); }}} public static void main (string [] args) lança IoException {file dir = new File ("f:/verifier"); int w = 200, h = 80; for (int i = 0; i <50; i ++) {string verifyCode = GeneratemveryCodeCode (4); Arquivo de arquivo = novo arquivo (dir, verifiqueCode + ".jpg"); outputImage (w, h, arquivo, verifiquecode); }}} Web.xml Configuração:
<Verlet> <Verlet-name> Authimage </servlet-name> <Servlet-class> hh.com.util.authimage </servlet-class> </servlet> <sirtlet-mapping> <sutlet-name> Authimage </servlet-name> <url-tattern>/authimage </rl-Pattern> </servlet-mutlep-MAPLAPTMAPGN>
O acima é tudo sobre este artigo. Espero que o inspire a aprender o código de verificação de imagem Java.