Este artículo comparte la versión Java del código de verificación de estilo de verificación de imitación QQ Código de verificación de imagen para todos. El contenido específico es el siguiente
Las características incluyen: tamaño de imagen personalizado y longitud del personaje, color de fondo aleatorio y color de caracteres, ángulo de compensación de caracteres aleatorio, borde liso del personaje, líneas de interferencia, ruido, distorsión de fondo.
Originalmente quería hacer que los personajes fueran retorcidos, pero no sé por qué el maestro escribió el texto y luego informó el error. Hagámoslo por ahora. Espero que un maestro pueda ayudar a corregirlo.
Cabe señalar que la razón por la que hay un poco como el código de verificación QQ es por esta fuente argelina. Si el sistema no tiene uno, debe instalarlo usted mismo. Puede descargar el nombre de fuente en Baidu y simplemente tirar la carpeta de fuentes del sistema.
Imagen de reproducción:
paquete hh.com.util; import java.io.ioException; import javax.servlet.servletException; import javax.servlet.http.httpservletRequest; import javax.servlet.http.httpservletResponse; import javax.servlet.http.httpservletResponse; import javax.servlet.http.httpsession; Public Class AuthImage extiende javax.servlet.http.httpservlet implementa javax.servlet.servlet {static final long serialversionUid = 1l; Servicio Public Void (solicitud httpservletRequest, httpservletreponse respuesta) lanza ServletException, ioexception {Response.setheader ("Pragma", "No-Cache"); Respuesta.setheader ("Cache-Control", "No-Cache"); respuesta.setDateHeader ("expiras", 0); respuesta.setContentType ("Image/jpeg"); // Generar cadena aleatoria de cadena VerifyCode = VerifyCodeUtils.GenerateverifyCode (4); // Guardar sesión Session httpsession session = request.getSession (true); session.SetAttribute ("rand", verifycode.tolowercase ()); // Generar imagen int w = 200, h = 80; VerifyCodeUtils.outputImage (W, H, Response.getOutputStream (), VerifyCode); }} Verificarcodeutils clase
paquete hh.com.util; import java.awt.color; import java.awt.font; import java.awt.graphics; import java.awt.graphics2d; import java.awt.lineargradientPaint; import java.awt.Paint; import java.awt.Renderinghints; import java.awt.geom.affinetransform; import; java.awt.image.bufferedImage; import java.io.file; import java.io.fileOutputStream; import java.io.ioexception; import java.io.outputstream; import java.util.arrays; import java.util.random; import javax.imageio.imageio; clase pública VerifyCodeUtils {// Use la fuente argelina, si no está en el sistema, la fuente solo muestra capitalización y elimina varios caracteres fácilmente confusos de 1,0, i, o public static final verify_codes = "23456789abcdefghjklmnpqrstuvwxyz"; privado static aleatorio = new Random (); / *** Use la fuente de caracteres predeterminada del sistema para generar código de verificación* @param verifySize Longitud del código de verificación* @return*/ public static string generifiyCode (int verifySize, verify_codes); } / *** Use la fuente especificada para generar el código de verificación* @param verifySize Longitud del código de verificación* @param Fuente del código de verificación Fuente de caracteres* @return* / public static String generifyCode (int verifysize, String Sources) {if (fuentes == null || fuentes.length () == 0) {fuentes = verify_codes; } int codeSlen = fuentes.length (); Rand aleatory = new Random (System.CurrentTimemillis ()); StringBuilder VerifyCode = new StringBuilder (VerifySize); for (int i = 0; i <verifySize; i ++) {verifycode.append (fuentes.charat (rand.nextint (codeslen-1))); } return verifyCode.ToString (); } / ** * Genere un archivo de código de verificación aleatorio y devuelva el valor del código de verificación * @param w * @param h * @param outputFile * @param verifySize * @return * @throws ioexception * / public static string outputiferifyImage (int w, int h, archivo outputfile, int verifySize) lanza iOexception {string verifyCode = verifyCode (verifyCode (verifyCode (verifyCode (verifyCode (verifyCode (verifyCode (verifyCode (verifyCode (verifeSeDEDEDEDEDEDEDEDEDEDEDEDEDIEDIEDIEDE); outputImage (W, H, OutputFile, VerifyCode); return VerifyCode; } / ** * emite la transmisión de imagen del código de verificación aleatoria y devuelve el valor del código de verificación * @param w * @param h * @param os * @param verifysize * @return * @throws ioexception * / public static string outgledImage (int w, int h, outputStream OS, int verifySize) lanza ioexception {string verifyCode = generifiDEDEDEDEDE (verifyCode (verifyCode (verifyCode (verifySize); outputImage (W, H, OS, VerifyCode); return VerifyCode; } / ** * Genere el archivo de imagen del código de verificación especificado * @param w * @param h * @param outputFile * @param código * @throws ioexception * / public static void outputImage (int w, int h, archivo de salida, código de cadena) lanza IOException {if (outputFile == null) {return; } Archivo dir = outputFile.getParentFile (); if (! dir.exists ()) {dir.mkdir (); } try {outputFile.CreateNewFile (); FileOutputStream fos = new FileOutputStream (outputFile); outputImage (W, H, Fos, código); fos.close (); } Catch (ioException e) {Throw E; }} / ** * Salida Código de verificación especificado SHRANTE * @param w * @param h * @param OS * @param código * @throws ioexception * / public static void outputiMage (int w, int h, outputStream OS, código de cadena) lanza ioexception {int veriFysize = code.length (); BufferedImage imagen = new BufferedImage (W, H, BufferedImage.type_int_rgb); Rand aleatorio = new Random (); Gráfico2d g2 = image.createGraphics (); g2.setrenderinghint (renderinghints.key_antialiasing, renderinghints.value_antialias_on); Color [] colores = nuevo color [5]; Color [] Colorspaces = New Color [] {color.white, color.cyan, color.gray, color.light_gray, color.magenta, color.orange, color.pink, color.elellow}; flotante [] fracciones = nuevo float [colores.length]; para (int i = 0; i <color.length; i ++) {colores [i] = ColorSpaces [rand.nextint (Colorspaces.length)]; fracciones [i] = rand.nextfloat (); } Arrays.sort (fracciones); g2.setColor (color.gray); // establecer el color del borde G2.Fillrect (0, 0, W, H); Color C = Getrandcolor (200, 250); g2.setColor (c); // establecer el color de fondo G2.Fillrect (0, 2, W, H-4); // Dibujar línea de interferencia aleatoria = new Random (); g2.setColor (getRandColor (160, 200)); // establece el color de la línea para (int i = 0; i <20; i ++) {int x = random.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); } // Agregar ruido float yawprate = 0.05f; // ruido ints ints Area = (int) (Yawprate * W * H); for (int i = 0; i <área; i ++) {int x = random.nextint (w); int y = random.nextint (h); int rgb = getRandomIntColor (); image.setRgb (x, y, rgb); } shear (g2, w, h, c); // distorsionar la imagen g2.setColor (getRandColor (100, 160)); int fontSize = H-4; Fuente de fuente = nueva fuente ("argelina", fuente. Ititalic, FontSize); g2.setFont (fuente); char [] chars = code.toCarArray (); for (int i = 0; i <verifySize; i ++) {affinetransform affine = new Affinetransform (); Affine.setToRotation (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 (imagen, "jpg", os); } color estático privado getRandColor (int fc, int bc) {if (fc> 255) fc = 255; if (BC> 255) BC = 255; int r = fc + random.nextint (bc - fc); int g = fc + random.nextint (BC - fc); int b = fc + random.nextint (bc - fc); devolver nuevo color (R, G, B); } private static int getRandomIntColor () {int [] rgb = getRandomRgb (); int color = 0; para (int c: rgb) {color = color << 8; color = color | do; } color de retorno; } private static int [] getrandomrgb () {int [] rgb = new int [3]; para (int i = 0; i <3; i ++) {rgb [i] = random.nextint (255); } return rgb; } cizallamiento vacío estático privado (Graphics G, int W1, int h1, color color) {shearx (g, w1, h1, color); Cerrario (G, W1, H1, color); } private static void shearx (Graphics G, int w1, int h1, color color) {int período = random.nextint (2); bordergap booleano = verdadero; int marco = 1; int fase = random.nextint (2); para (int i = 0; i <h1; i ++) {doble d = (doble) (período >> 1) * Math.sin ((doble) I / (doble) Período+(6.2831853071795862d * (doble) fase) / (doble) Framas); g.copyarea (0, i, w1, 1, (int) d, 0); if (bordergap) {g.setColor (color); g.drawline ((int) d, i, 0, i); g.drawline ((int) d + w1, i, w1, i); }}} private static void sheary (Graphics G, int w1, int h1, color color) {int período = random.nextint (40) + 10; // 50; bordergap booleano = verdadero; int marco = 20; int fase = 7; para (int i = 0; i <w1; i ++) {doble d = (doble) (período >> 1) * Math.sin ((doble) I / (doble) Período+(6.2831853071795862d * (doble) fase) / (doble) Frames); g.copyarea (i, 0, 1, h1, 0, (int) d); if (bordergap) {g.setColor (color); g.drawline (i, (int) d, i, 0); G.Drawline (i, (int) d + h1, i, h1); }}} public static void main (string [] args) lanza ioexception {archivo dir = new File ("f:/verifier"); int w = 200, h = 80; for (int i = 0; i <50; i ++) {String VerifyCode = GenerifyCode (4); Archivo archivo = nuevo archivo (dir, verifycode + ".jpg"); outputImage (w, h, archivo, verifyCode); }}} Configuración web.xml:
<Servlet> <Servlet-name> Authimage </servlet-name> <ervlet-class> hh.com.util.authimage </servlet-class> </servlet> <ervlet-mapping> <ervlet-name> autimage </servlet-name> <url-pattern>/authimage </sl-pattern> </servlet-mapping>
Lo anterior se trata de este artículo. Espero que te inspire a aprender el código de verificación de imagen Java.