В этой статье разделяет Java -версию имитационного кода проверки кода кода QQ кода для всех. Конкретный контент заключается в следующем
Особенности включают в себя: пользовательский размер изображения и длина символа, случайный цвет фона и цвет символов, случайный угол смещения символов, гладкий край символа, линии интерференции, шум, искажение фона.
Первоначально я хотел сделать персонажей извращенными, но я не знаю, почему учитель написал текст, а затем сообщил об ошибке. Давайте сделаем это на данный момент. Я надеюсь, что мастер может помочь исправить это.
Следует отметить, что причина, по которой есть немного похожа на код проверки QQ, заключается в этом алжирском шрифте. Если у системы его нет, вам нужно установить сами. Вы можете скачать имя шрифта на Baidu и просто выбросить папку System Fonts.
Изображение воспроизведения:
Пакет hh.com.util; импортировать java.io.ioexception; Импорт javax.servlet.servletexception; Импорт javax.servlet.http.httpservletrequest; Импорт javax.servlet.http.httpservletresponse; Импорт javax.servlet.http.httpservletresponse; Импорт javax.servlet.http.httpsession; Public Class Authimage Extends javax.servlet.http.httpservlet реализует javax.servlet.servlet {статический окончательный длинный long serialversionuid = 1L; Public void Service (httpservlectrequest, httpservletresponse response) бросает Servletexception, ioException {response.setheader («Pragma», «без Cache»); response.setheader («Контроль кэша», «без каша»); response.setDateHeader («истекает», 0); response.setContentType ("Image/jpeg"); // генерировать случайную строку string verifycode = verifycodeutils.generateverifycode (4); // Сохранить сеанс сеанса httpsession session = request.getsession (true); session.setattribute ("rand", verifycode.tolowercase ()); // генерировать изображение int w = 200, h = 80; VerifyCodeutils.OutputImage (w, h, response.getOutputStream (), verifyCode); }} VerifyCodeutils Class
Пакет hh.com.util; Импорт java.awt.color; import java.awt.font; import java.awt.graphics; импорт java.awt.graphics2d; import java.awt.lineargradientpaint; импорт java.awt.paint; импорт java.awt.renderinghints; импорт Java.AaffInetransform; java.awt.image.bufferedImage; импорт java.io.file; импорт java.io.fileOutputStream; импорт java.io.ioexception; импорт java.io.outputstream; импорт java.util.arrays; import java.util.random; Импорт javax.imageio.imageio; открытый класс VerifyCodeUtils {// Использование алжирского шрифта, если он не находится в системе, шрифт только отображает заглавную букву и удаляет несколько легко запутанных символов 1,0, I, o public Static Final String verify_codes = "23456789abcdefghjklmnpqrStuvwxyz"; частный статический случайный случайный random = new Random (); / *** Используйте источник символа системы по умолчанию, чтобы генерировать код проверки* @param verifysize dlonge кода проверки* @return*/ public Static String GenerateReverifyCode (int verifysize, verify_codes); } / *** Используйте указанный источник, чтобы генерировать код проверки* @param verifysize wervification код кода* @param Источники проверки кода. } int codeslen = sources.length (); Случайный rand = new Random (System.CurrentTimeMiLlis ()); StringBuilder verifyCode = new StringBuilder (verifySize); for (int i = 0; i <verifysize; i ++) {verifycode.append (sources.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); outputImage (w, h, output -file, verifycode); вернуть VerifyCode; } / ** * Вывод поток изображения кода случайной проверки и вернуть значение кода проверки * @param w * @param h * @param os * @param verifysize * @return * @throws ioexception * / public Static outputVerifyImage (int w, int h, outputStream os, int verifysize) throws {string verifycodecodecodecodecodeCodeCodeCodeCodeCodeCodeCodeCodeCodeCodeCodeCodeCodeCode). outputImage (W, H, OS, VerifyCode); вернуть VerifyCode; } / ** * Сгенерировать указанный файл изображения кода проверки * @param w * @param h * @param outputfile * @param code * @throws ioexception * / public static void outputImage (int w, int h, file output -file, строковый код) 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; }} / ** * Вывод Указанный Поток изображения кода проверки * @param w * @param h * @param os * @param code * @throws ioexception * / public static out outputImage (int w, int h, outputstream os, строковый код), вызывает ioexception {int verifysize = code.length (); BufferedImage Image = new BufferedImage (w, h, bufferedimage.type_int_rgb); Случайный rand = new Random (); Graphics2d g2 = image.creategraphics (); g2.setRenderingHint (renderingHints.key_antialiasing, renderingHints.value_antialias_on); Цвет [] цвета = новый цвет [5]; Color [] colorspaces = new Color [] {color.white, color.cyan, color.gray, color.light_gray, color.magenta, color.orange, color.pink, color.yellow}; float [] fractions = new Float [colors.length]; for (int i = 0; i <colors.length; i ++) {colors [i] = colorspaces [rand.nextint (colorspaces.length)]; fracts [i] = rand.nextfloat (); } Arrays.sort (фракции); g2.setcolor (color.gray); // set color border g2.fillrect (0, 0, w, h); Цвет C = GetrandColor (200, 250); g2.setcolor (c); // установить цвет фона g2.fillrect (0, 2, w, h-4); // нарисовать интерференционную линию random random = new random (); g2.setcolor (getrandcolor (160, 200)); // установить цвет линии для (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); } // Добавить шум float hawprate = 0,05F; // скорость шума int area = (int) (hawprate * 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); // исказить картину g2.setcolor (getrandcolor (100, 160)); int fontsize = h-4; Font font = новый шрифт («Алжир», font.italic, fontsize); g2.setfont (шрифт); char [] chars = code.thararray (); 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 (Image, "jpg", OS); } частный статический цвет 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); вернуть новый цвет (r, g, b); } private static int getrandomintcolor () {int [] rgb = getrandomrgb (); int color = 0; for (int c: rgb) {color = color << 8; цвет = цвет | c; } вернуть цвет; } private static int [] getrandomrgb () {int [] rgb = new int [3]; for (int i = 0; i <3; i ++) {rgb [i] = random.nextint (255); } вернуть rgb; } Частный статический void -сдвиг (графика G, Int W1, Int H1, цвет) {shearx (g, w1, h1, color); Шари (G, W1, H1, Color); } private static void shearx (графика G, int w1, int h1, color) {int pury = random.nextint (2); логический пограничный град = true; int рамы = 1; int phase = random.nextint (2); for (int i = 0; i <h1; i ++) {double d = (двойной) (период >> 1) * Math.sin ((двойной) I / (двойной) период+(6.2831853071795862d * (двойной) фаза) / (двойные) рамы); 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 (графика G, int w1, int h1, color) {int pury = random.nextint (40) + 10; // 50; логический пограничный град = true; int рамы = 20; int phase = 7; for (int i = 0; i <w1; i ++) {double d = (Double) (период >> 1) * Math.sin ((двойной) I / (двойной) период+(6.2831853071795862d * (двойной) фаза) / (двойные) рамы); 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) бросает ioException {file dir = new File ("f:/verifier"); int w = 200, h = 80; for (int i = 0; i <50; i ++) {string verifycode = GenerateVerifyCode (4); File file = new File (dir, verifyCode + ".jpg"); outputImage (w, h, файл, проверка кода); }}} Конфигурация web.xml:
<servlet> <servlet-name> authimage </servlet-name> <verlet-class> hh.com.util.authimage </servlet-class> </servlet> <servlet-mapping> <servlet-name> Authimage </servlet-name> <url-pattern>/outrimage </url-pattern> </Servlet>
Выше всего об этой статье. Я надеюсь, что это вдохновит вас на изучение кода проверки изображений Java.