Cet article partage la version Java du code de vérification d'image du style de code de vérification d'imitation QQ pour tout le monde. Le contenu spécifique est le suivant
Les caractéristiques comprennent: la taille de l'image personnalisée et la longueur du caractère, la couleur de fond aléatoire et la couleur des caractères, l'angle de décalage de caractère aléatoire, le bord lisse des caractères, les lignes d'interférence, le bruit, la distorsion d'arrière-plan.
À l'origine, je voulais faire torsion des personnages, mais je ne sais pas pourquoi l'enseignant a écrit le texte, puis a signalé l'erreur. Faisons-le pour le moment. J'espère qu'un maître peut aider à le corriger.
Il convient de noter que la raison pour laquelle il y a un peu comme le code de vérification QQ est due à cette police algérienne. Si le système n'en a pas, vous devez l'installer vous-même. Vous pouvez télécharger le nom de police sur Baidu et simplement jeter le dossier System Fonts.
Image de reproduction:
Package hh.com.util; Importer java.io.ioException; Importer javax.servlet.servletException; Importer javax.servlet.http.httpservletRequest; import javax.servlet.http.httpservletResponse; import javax.servlet.http.httpservletResponse; Importer javax.servlet.http.httpSession; La classe publique Authimage étend Javax.servlet.http.httpServlet implémente javax.servlet.servlet {statique finale longue serialversionUID = 1l; Le service public void (demande httpservletRequest, réponse httpservletResponse) lève ServletException, ioException {réponse.sethEader ("pragma", "non-cache"); Response.sethEader ("Cache-Control", "No-cache"); réponse.setDateHeader ("expire", 0); réponse.setContentType ("Image / JPEG"); // Générer une chaîne aléatoire VerifyCode = VerifyCodeUtils.GenERETERIFYCODE (4); // Enregistrer la session de session httpSession session = request.getSession (true); session.setAttribute ("Rand", VerifyCode.tolowerCase ()); // Générer l'image int w = 200, h = 80; VerifyCodeUtils.outputImage (W, H, Response.getOutputStream (), VerifyCode); }} Classe VerifyCodeUtils
Package 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; 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; classe publique VerifyCodeUtils {// Utilisez la police algérienne, si elle n'est pas dans le système, la police affiche uniquement la capitalisation et supprime plusieurs caractères facilement déroutants de 1,0, i, o Public Static Final String Verify_codes = "23456789AbcDefghjklmnpqrsvwxyz"; Random random statique privé = nouveau aléatoire (); / ** * Utilisez la source de caractères par défaut du système pour générer du code de vérification * @param Verifysize Verification Code Longueur * @return * / public static String GeneraterifyCode (int Verifysize, Verify_Codes); } / ** * Utilisez la source spécifiée pour générer le code de vérification * @param Verifysize Verification Code Longueur * @Param Sources Code de vérification Code de caractères Source * @return * / public static String GreeterifyCode (int VerifySize, String Sources) {Sources = Verify_Codes || } int codeslen = sources.length (); Random Rand = new Random (System.CurrentTimemillis ()); StringBuilder VerifyCode = new StringBuilder (Verifysize); for (int i = 0; i <Verifysize; i ++) {VerifyCode.Apend (sources.charat (rand.nextint (codeslen-1))); } return VerifyCode.ToString (); } / ** * générer un fichier de code de vérification aléatoire et renvoyer la valeur du code de vérification * @param w * @param h * @param outputfile * @param verifysize * @return * @throws ioexception * / public static string OutputVerifyImage (int w, int h, fichier outputFile, int Verifysize) lance; OutputImage (W, H, OutputFile, VerifyCode); return VerifyCode; } / ** * Sortie du flux d'image du code de vérification aléatoire et renvoyez la valeur du code de vérification * @param w * @param h * @param os * @param verifysize * @return * @throws ioexception * / public static string static outweetveryImage (int w, int h, outputStream os, int Verifysize) throws ioException {String VerifyCode = GenerySe OutputImage (W, H, OS, VerifyCode); return VerifyCode; } / ** * Générer le fichier d'image de code de vérification spécifié * @param w * @param h * @param outputFile * @param code * @throws ioException * / public static void OutputImage (int w, int h, file OutputFile, String Code) lance ioException {if (outputFile == null) {return; } File dir = outputFile.getParentFile (); if (! dir.exists ()) {dir.mkdir (); } try {outputFile.CreateEwFile (); FileOutputStream fos = new FileOutputStream (OutputFile); OutputImage (W, H, FOS, code); fos.close (); } catch (ioException e) {throw e; }} / ** * Sortie Spécifiée Code de vérification Stream d'image * @param w * @param h * @param os * @param code * @throws ioException * / public static void OutputImage (int w, int h, outputStream OS, String Code) lance ioException {int VerifySize = Code.Length (); BufferedImage Image = new BufferedImage (W, H, BufferedImage.Type_int_rgb); Random Rand = new Random (); Graphics2d g2 = image.creategraphics (); G2.SetRenderingHint (RenderingHint.Key_antialiasing, RenderingHint.value_antialias_on); Couleur [] couleurs = nouvelle couleur [5]; Couleur [] couleurs = new Color [] {Color.white, Color.cyan, Color.Gray, Color.light_Gray, Color.magenta, Color.Orange, Color.pink, Color.yellow}; float [] fractions = new float [couleurs.length]; for (int i = 0; i <couleurs.length; i ++) {couleurs [i] = couleurs [rand.nextint (couleurs couleurs.length)]; fractions [i] = rand.nextfloat (); } Arrays.sort (fractions); G2.SetColor (Color.Gray); // Définir la couleur de la bordure G2.Fillrect (0, 0, W, H); Couleur c = getrandcolor (200, 250); G2.SetColor (C); // Définir la couleur d'arrière-plan G2.Fillrect (0, 2, W, H-4); // dessine la ligne d'interférence aléatoire aléatoire = new random (); g2.SetColor (getrandColor (160, 200)); // définir la couleur de la ligne pour (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); } // Ajouter un float de bruit Yawprate = 0,05f; // Rate de bruit int aire = (int) (yawprate * w * h); pour (int i = 0; i <zone; i ++) {int x = random.nextint (w); int y = random.nextint (h); int rgb = getRandomintColor (); image.setrgb (x, y, rgb); } cisaillement (g2, w, h, c); // déformer l'image g2.setColor (getrandColor (100, 160)); int fonSSIZE = H-4; FONT FONT = NOUVELLE FONT ("Algérien", Font.Italic, FonTSize); G2.SetFont (FONT); char [] chars = code.tocharArray (); 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 + Fontize / 2, h / 2); G2.SetTransform (Affine); G2.Drawchars (Chars, I, 1, ((W-10) / Verifysize) * I + 5, H / 2 + Fontize / 2 - 10); } g2.dispose (); Imageo.write (image, "jpg", os); } Couleur statique privée 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); retourner une nouvelle couleur (r, g, b); } private static int getRandomintColor () {int [] rgb = getrandomrgb (); int color = 0; pour (int c: rgb) {Color = Color << 8; Color = Color | C; } retour de couleur; } private static int [] getrandomrgb () {int [] rgb = new int [3]; for (int i = 0; i <3; i ++) {rgb [i] = random.nextint (255); } return rgb; } cisaillement vide statique privé (graphiques g, int w1, int h1, couleur couleur) {shearx (g, w1, h1, couleur); Sheary (G, W1, H1, couleur); } private static void shearx (graphics g, int w1, int h1, couleur couleur) {int period = random.nextint (2); Boolean BorderGap = True; int trames = 1; int phase = random.nextint (2); pour (int i = 0; i <h1; i ++) {double d = (double) (période >> 1) * math.sin ((double) i / (double) période + (6.2831853071795862d * (double) phase) / (double) cadres); G.CopyArea (0, I, W1, 1, (int) D, 0); if (bordergap) {g.setColor (couleur); G.Drawline ((int) d, i, 0, i); G.Drawline ((int) d + w1, i, w1, i); }}} private static void sharey (graphics g, int w1, int h1, couleur couleur) {int period = random.nextint (40) + 10; // 50; Boolean BorderGap = True; int trames = 20; phase int = 7; pour (int i = 0; i <w1; i ++) {double d = (double) (période >> 1) * math.sin ((double) i / (double) période + (6.2831853071795862d * (double) phase) / (double) cadres); G.CopyArea (I, 0, 1, H1, 0, (int) d); if (bordergap) {g.setColor (couleur); G.Drawline (i, (int) d, i, 0); G.Drawline (i, (int) d + h1, i, h1); }}} public static void main (string [] args) lève ioException {file dir = new File ("f: / vérificateur"); int w = 200, h = 80; pour (int i = 0; i <50; i ++) {String VerifyCode = GenerateIfyCode (4); File file = new File (dir, VerifyCode + ".jpg"); OutputImage (W, H, File, VerifyCode); }}} Web.xml Configuration:
<VerTlet> <Servlet-Name> Authimage </ Servlet-Name> <Servlet-Class> Hh.com.util.authimage </ servlet-Class> </ Servlet> <Servlet Mapping> <Servlet-Name> Authimage </vrlett-name> <Url-Pattern> / Authimage </rImage> </vrlett-mapping>
Ce qui précède concerne cet article. J'espère que cela vous inspirera à apprendre le code de vérification de l'image Java.