Artikel ini membagikan versi Java dari kode verifikasi gaya verifikasi qq verifikasi kode verifikasi untuk semua orang. Konten spesifiknya adalah sebagai berikut
Fitur meliputi: ukuran gambar kustom dan panjang karakter, warna latar belakang acak dan warna karakter, sudut offset karakter acak, tepi halus karakter, garis interferensi, noise, distorsi latar belakang.
Awalnya saya ingin membuat karakter terpelintir, tetapi saya tidak tahu mengapa guru menulis teks dan kemudian melaporkan kesalahannya. Mari kita lakukan untuk saat ini. Saya berharap seorang master dapat membantu memperbaikinya.
Perlu dicatat bahwa alasan mengapa ada sedikit seperti kode verifikasi QQ adalah karena font Aljazair ini. Jika sistem tidak memilikinya, Anda perlu menginstalnya sendiri. Anda dapat mengunduh nama font di Baidu dan hanya membuang folder Sistem Font.
Gambar reproduksi:
paket hh.com.util; impor java.io.ioException; impor javax.servlet.servletException; impor javax.servlet.http.httpservletRequest; impor javax.servlet.http.httpservletResponse; impor javax.servlet.http.httpservletResponse; impor javax.servlet.http.httpsession; Authimage kelas publik memperluas javax.servlet.http.httpservlet mengimplementasikan javax.servlet.servlet {static final long serialversionuid = 1l; Layanan public void (permintaan httpservletRequest, respons httpservletResponse) melempar servletException, ioException {response.setHeader ("pragma", "no-cache"); response.setheader ("cache-control", "no-cache"); response.setDateheader ("kedaluwarsa", 0); response.setContentType ("Image/JPEG"); // Hasilkan String Random String VerifyCode = VerifyCodeutils.GenerateVeryCode (4); // Simpan sesi sesi httpsession sesi = request.getSession (true); session.setAttribute ("rand", verifycode.tolowercase ()); // menghasilkan gambar int w = 200, h = 80; VerifyCodeutils.outputImage (w, h, response.getoutputStream (), verifyCode); }} Memverifikasi kelas kelas
paket hh.com.util; impor java.awt.color; impor java.awt.font; impor java.awt.graphics; impor java.awt.graphics2d; impor java.awt.lineeargradientpaint; impor java.awt.paint; impor java.awt.renderinghints; impor java.paint; java.awt.image.bufferedimage; impor java.io.file; impor java.io.fileoutputStream; import java.io.ioException; impor java.io.outputstream; import java.util.arrays; impor java.util.random; impor javax.imageio.imageio; Kelas Publik VerifyCodeutils {// Gunakan font Aljazair, jika tidak ada dalam sistem, font hanya menampilkan kapitalisasi, dan menghapus beberapa karakter yang mudah membingungkan 1,0, i, o string final statis public verify_codes = "23456789AbcDefghjklMnpqqrstuvwxyz"; private static acak acak = acak baru (); / *** Gunakan sumber karakter default sistem untuk menghasilkan kode verifikasi* @param memverifikasi panjang kode verifikasi* @return*/ public static string generateVerifyCode (int verifysize, verify_codes); } / *** Gunakan sumber yang ditentukan untuk menghasilkan kode verifikasi* @param Verifysize Kode Verifikasi Panjang* @param Sumber Sumber Kode Verifikasi Sumber* @Return* / Public Static String GenerAteFerifyCode (Int Verifysize, Sumber String) {if (Sumber == NULL || Sumber.Length () == 0) {Sumber if (Sumber == NULL || Sumber.Length () == 0) {Sumber if (Sumber == NULL || Sumber.Length () == 0) {if (Sumber == null || Sources.length () == 0) {if (Sumber ==; } int codeslen = Sources.length (); Acak rand = acak baru (System.CurrentTimeMillis ()); StringBuilder VerifyCode = StringBuilder baru (Verifysize); untuk (int i = 0; i <verifysize; i ++) {verifyCode.append (sumber.charat (rand.nextInt (codeslen-1))); } return verifyCode.toString (); } / ** * Hasilkan file kode verifikasi acak dan kembalikan nilai kode verifikasi * @param w * @param h * @param outputFile * @param verifysize * @return * @throws ioException * / public static outputverifiFiage (int w, int h, file outputFile, int verifisize) throws iooo -throws ioooCeption (int w, int h, file outputFile, int verifysize) throws iooo -throws iooOccepte (int w, h, file outputFile, int verifysize) throws iooo -throws iooo -thows IOOO GenerAteVeryCode (Verifysize); outputImage (w, h, outputFile, verifyCode); return verifyCode; } /** * Output the random verification code image stream and return the verification code value* @param w * @param h * @param os * @param verifySize * @return * @throws IOException */ public static String outputVerifyImage(int w, int h, OutputStream os, int verifySize) throws IOException{ String verifyCode = generateVerifyCode(verifySize); outputImage (w, h, os, verifikasi kode); return verifyCode; } /** * Generate the specified verification code image file* @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 (); } coba {outputFile.createNewFile (); FileOutputStream fos = baru fileOutputStream (outputFile); outputImage (w, h, fos, kode); fos.close (); } catch (ioException e) {throw e; }} / ** * Output streaming gambar kode verifikasi yang ditentukan * @param w * @param h * @param os * @param kode * @throws ioException * / public static void outputImage (int w, int h, outputStream OS, string code) melempar ioException {int verifysize =. BufferedImage Image = BufferedImage baru (W, H, bufferedImage.type_int_rgb); Rand acak = acak baru (); Grafik2d g2 = image.creategraphics (); g2.setrenderinghint (renderinghints.key_antialiasing, renderinghints.value_antialias_on); Warna [] warna = warna baru [5]; Color [] colorspaces = new color [] {color.white, color.cyan, color.gray, color.light_gray, color.magenta, color.orange, color.pink, color.yellow}; float [] fraksi = float baru [colors.length]; untuk (int i = 0; i <colors.length; i ++) {colors [i] = colorspaces [rand.nextint (colorspaces.length)]; fraksi [i] = rand.nextfloat (); } Arrays.sort (fraksi); g2.setColor (color.gray); // atur warna perbatasan g2.fillrect (0, 0, w, h); Warna C = GetRandColor (200, 250); g2.setColor (c); // atur warna latar belakang g2.fillrect (0, 2, w, h-4); // Gambarkan garis interferensi acak acak = acak baru (); g2.setColor (getRandColor (160, 200)); // atur warna garis untuk (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); } // Tambahkan noise float yawprate = 0.05f; // noise rate int Area = (int) (yawprate * w * h); untuk (int i = 0; i <area; i ++) {int x = random.nextInt (w); int y = random.nextInt (h); int rGB = getRandomIntColor (); image.setrgb (x, y, rgb); } Shear (G2, W, H, C); // Mendistorsi gambar G2.setColor (getRandColor (100, 160)); int fontSize = H-4; Font font = font baru ("Aljazair", font.italic, fontSize); g2.setFont (font); char [] chars = code.tochararray (); untuk (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 (); Imageo.write (Image, "JPG", OS); } private static color 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); mengembalikan warna baru (r, g, b); } private static int getRandomIntColor () {int [] rgb = getRandomrgb (); warna int = 0; untuk (int c: rgb) {color = color << 8; warna = warna | C; } return color; } private static int [] getRandoMrgB () {int [] rgb = int new [3]; untuk (int i = 0; i <3; i ++) {rgb [i] = random.nextInt (255); } return RGB; } shear void private static (grafik G, int w1, int h1, warna warna) {shearx (g, w1, h1, warna); Sheary (G, W1, H1, Color); } private static void shearx (grafik g, int w1, int h1, warna warna) {int periode = acak.nextint (2); Boolean BorderGap = true; int frame = 1; int fase = random.nextInt (2); untuk (int i = 0; i <h1; i ++) {double d = (double) (periode >> 1) * math.sin ((ganda) I / (ganda) periode+(6.2831853071795862d * (ganda) fase) / (ganda) frame); G.CopyArea (0, I, W1, 1, (int) d, 0); if (bordergap) {g.setColor (warna); G.Drawline ((int) d, i, 0, i); g.drawline ((int) d + w1, i, w1, i); }}} private static void sheary (grafik g, int w1, int h1, warna warna) {int periode = acak.nextint (40) + 10; // 50; Boolean BorderGap = true; int frame = 20; int fase = 7; untuk (int i = 0; i <w1; i ++) {double d = (double) (periode >> 1) * math.sin ((ganda) I / (ganda) periode+(6.2831853071795862d * (ganda) fase) / (ganda) frame); G.CopyArea (I, 0, 1, H1, 0, (int) D); if (bordergap) {g.setColor (warna); G.Drawline (i, (int) d, i, 0); G.Drawline (i, (int) d + h1, i, h1); }}} public static void main (string [] args) melempar ioException {file dir = file baru ("f:/verifier"); int w = 200, h = 80; untuk (int i = 0; i <50; i ++) {String verifyCode = generAseveryCode (4); File file = file baru (dir, verifyCode + ".jpg"); outputImage (w, h, file, verifyCode); }}} Konfigurasi web.xml:
<servlet> <servlet-name> authimage </servlet-name> <servlet-class> hh.com.util.authimage </servlet-class> </servlet> <servlet-papping> <servlet-name> authimage </servlet-name> <rerl-pattern>/authimage </url-pattern> </servlet-phatping>
Di atas adalah semua tentang artikel ini. Saya harap ini akan menginspirasi Anda untuk mempelajari kode verifikasi gambar Java.