Dieser Artikel teilt die Java -Version des Imitations -QQ -Verifizierungscodestil -Bildverifizierungscodes für alle. Der spezifische Inhalt ist wie folgt
Zu den Merkmalen gehören: benutzerdefinierte Bildgröße und Zeichenlänge, zufällige Hintergrundfarbe und Charakterfarbe, Zufallszeichenversetzwinkel, charakterische glatte Kante, Interferenzleitungen, Rauschen, Hintergrundverzerrung.
Ich wollte ursprünglich Charaktere verdrehen, aber ich weiß nicht, warum der Lehrer den Text geschrieben habe und dann den Fehler gemeldet hat. Lass es uns vorerst tun. Ich hoffe, ein Meister kann helfen, es zu korrigieren.
Es ist zu beachten, dass der Grund, warum es ein bisschen wie den QQ -Verifizierungscode gibt, auf diese algerische Schriftart liegt. Wenn das System keine hat, müssen Sie es selbst installieren. Sie können den Schriftnamen auf Baidu herunterladen und einfach den Ordner System -Schriftarten wegwerfen.
Reproduktionsbild:
Paket hh.com.util; importieren java.io.ioException; importieren javax.servlet.servletException; importieren javax.servlet.http.httpServletRequest; importieren javax.servlet.http.httpServletResponse; importieren javax.servlet.http.httpServletResponse; import Javax.servlet.http.httpSession; Public Class Authimage erweitert javax.servlet.http.httpServlet implementiert javax.servlet.servlet {statische endgültige lange Serialversionuid = 1L; public void Service (httpServletRequest-Anfrage, httpServletResponse-Antwort) löst ServletException aus, ioException {response.setheader ("pragma", "no-cache"); response.setheader ("cache-control", "no-cache"); response.setDateHeader ("läuft", 0); Antwort.SetContentType ("Image/JPEG"); // zufällige String -Zeichenfolge verifizieren, verifizieren SieCode = verifyCodeUtils.generateverifyCode (4); // Sitzungssitzung speichern httpSession session = request.getSession (true); Session.SetAttribute ("Rand", verifyCode.tolowerCase ()); // Image int w = 200, H = 80 erzeugen; VerifyCodeUtils.outputImage (w, h, response.getOutputStream (), verifyCode); }} VerififyCodeUtils -Klasse
Paket 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.buffenedimage; import Java.io.file; import Java.io.filoutputStream; Import Java.io.ioException; Import Java.io.outputStream; Import Java.util.Arrays; Import Java.util.random; import Javax.imageo.imageo; Public Class VerifyCodeUtils {// Verwenden Sie die algerische Schriftart, wenn sie sich nicht im System befindet, zeigt die Schrift nur die Kapitalisierung an und beseitigt mehrere leicht verwirrende Zeichen von 1,0, o public static endgültiger String verify_codes = "23456789abcdefghjklmnpqrstuvwxyz"; private static random random = new random (); / *** Verwenden Sie die System -Standardzeichenquelle, um den Verifizierungscode zu generieren } / *** Verwenden Sie die angegebene Quelle, um den Verifizierungscode zu generieren } int codeslen = socres.length (); Random rand = new random (system.currentTimemillis ()); StringBuilder verifyCode = new StringBuilder (verifysize); für (int i = 0; i <verifysize; i ++) {verifyCode.Append (Quellen.Charat (Rand.Nextint (Codeslen-1))); } return verifyCode.toString (); } /** * Generate a random verification code file and return the verification code value* @param w * @param h * @param outputFile * @param verifySize * @return * @throws IOException */ public static String outputVerifyImage(int w, int h, File outputFile, int verifySize) throws IOException{ String verifyCode = generateVerifyCode(verifySize); Ausgangsimage (W, H, OutputFile, VerifyCode); return verifyCode zurück; } / ** * Ausgabe des Zufallsverifizierungscode -Bildstroms und geben Sie den Verifizierungscodewert zurück * @param w * @param h * @param os * @param verifySize * @return * @throw ioException * / public static String optimalVerifyImage (int w, ing, outputStream os, infySize) throws ioException {StringCode {StringCode {StringCode {String {String {StringCode {String {String {String {String {String {StringCode). outputImage (w, h, os, verifyCode); return verifyCode zurück; } / ** * Generieren Sie die angegebene Verifizierungscode -Bilddatei * @param w * @param h * @param outputFile * @param code * @throws ioException * / public static void outputImage (int w, int h, file outputFile, String -Code) Throws IOException {if (outputFile == null) {return; } File Dir = outputFile.getParentFile (); if (! Dir.Exists ()) {dir.mkdir (); } try {outputFile.createNewFile (); FileOutputStream fos = new FileOutputStream (outputFile); outputImage (w, h, fos, Code); fos.close (); } catch (ioException e) {throw e; }} / ** * Ausgabebedingter Bestätigungscode -Bild Stream * @param W * @param H * @param os * @param code * @throws ioException * / public static void outputImage (int w, int h, outputStream os, String -Code) Wurfs iOException {int verifySize = code.length (); Bufferedimage image = new bufferedImage (w, h, bufferedimage.type_int_rgb); Random rand = new random (); Graphics2d G2 = Bild.CreateGraphics (); g2.setRenderingHint (renderingHints.key_antialiasing, renderingHints.value_antialias_on); Color [] farben = neue Farbe [5]; Color [] colorSpaces = new color [] {color.white, color.cyan, color.gray, color.light_gray, color.magenta, color.orange, color.pink, color.ybell}; float [] fraktions = neu float [farben.length]; für (int i = 0; i <colors.length; i ++) {farben [i] = folorspaces [rand.nextint (farbenpaces.length)]; Fraktionen [i] = Rand.Nextfloat (); } Arrays.sort (Fraktionen); g2.setColor (color.gray); // Randfarbe G2.FillRect (0, 0, W, H) festlegen; Farbe C = getrandcolor (200, 250); g2.setColor (c); // Hintergrundfarbe G2.FillRect (0, 2, W, H-4) festlegen; // Interferenzlinie zeichnen Random Random = New Random (); g2.setColor (getrandcolor (160, 200)); // Setzen Sie die Farbe der Zeile für (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); } // Rauschen float yawprat = 0,05f; // Rauschgeschwindigkeit int Area = (int) (YAWPRATE * W * H); für (int i = 0; i <ase; i ++) {int x = random.Nextint (w); int y = random.nextint (h); int rgb = getRandomintcolor (); Image.SetRGB (x, y, rgb); } scher (g2, w, h, c); // das Bild g2.setColor (getrandcolor (100, 160)); int fontsize = h-4; Schriftart = Neue Schriftart ("Algerian", font.italic, fontsize); g2.setfont (Schriftart); char [] chars = code.toCharArray (); für (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.DiSonS (); Imageio.Write (Bild, "JPG", OS); } private statische Farbe 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); Neue Farbe zurückgeben (r, g, b); } private static int getRandomintcolor () {int [] rgb = getRandomrgb (); int color = 0; für (int c: rgb) {color = color << 8; Farbe = Farbe | C; } return color; } private static int [] getRandomrgb () {int [] rgb = new int [3]; für (int i = 0; i <3; i ++) {rgb [i] = random.nextint (255); } return rgb; } private statische Hohlraumschere (Grafik G, int W1, int H1, Farbfarbe) {Shearx (G, W1, H1, Farbe); SHARY (G, W1, H1, Farbe); } private statische void Shearx (Grafik G, int W1, int H1, Farbe Farbe) {int Periode = random.Nextint (2); booleschen BorderGap = true; int Frames = 1; int Phase = random.Nextint (2); für (int i = 0; i <h1; i ++) {double d = (double) (Periode >> 1) * Math.sin ((doppelte) i / (doppelte) Periode+(6,2831853071795862d * (doppelte) Phase) / (doppelte) Frames); g. copyarea (0, i, w1, 1, (int) d, 0); if (borderGap) {g.setColor (Farbe); g.drawline ((int) d, i, 0, i); g.drawline ((int) d + w1, i, w1, i); }}} private statische void Sheary (Grafik G, int W1, int H1, Farbe Farbe) {int Periode = random.Nextint (40) + 10; // 50; booleschen BorderGap = true; int Frames = 20; int Phase = 7; für (int i = 0; i <w1; i ++) {double d = (double) (Periode >> 1) * Math.sin ((doppelte) i / (doppelte) Periode+(6,2831853071795862d * (doppelte) Phase) / (doppelte) Frames); g. copyarea (i, 0, 1, h1, 0, (int) d); if (borderGap) {g.setColor (Farbe); g.drawline (i, (int) d, i, 0); g.drawline (i, (int) d + h1, i, h1); }}} public static void main (String [] args) löst IOException {Datei Dir = neue Datei ("f:/verifier") aus; int w = 200, h = 80; für (int i = 0; i <50; i ++) {String verifyCode = generiectionCode (4); Datei Datei = new Datei (DIR, verifyCode + ".jpg"); outputImage (W, h, Datei, verifizierenCode); }}} Web.xml -Konfiguration:
<servlet> <servlet-Name> Authimage </Servlet-Name> <Servlet-Class> HH.com.util.authimage </Servlet-Class> </Servlet> <Servlet-Mapping> <Servlet-Name> Authimage </Servlet-Name> <url-patter
Das obige dreht sich alles um diesen Artikel. Ich hoffe, es wird Sie dazu inspirieren, Java -Bildüberprüfungscode zu lernen.