この記事では、すべての人向けのImitation QQ検証コードスタイルの画像検証コードのJavaバージョンを共有しています。特定のコンテンツは次のとおりです
機能には、カスタム画像サイズと文字の長さ、ランダムな背景色と文字の色、ランダムな文字オフセット角度、文字滑らかなエッジ、干渉ライン、ノイズ、背景の歪みが含まれます。
私はもともとキャラクターをねじれたかったのですが、教師がテキストを書いてからエラーを報告した理由はわかりません。今のところやりましょう。マスターがそれを修正するのを手伝ってくれることを願っています。
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をインポートします。パブリッククラスのauthimageはjavax.servlet.http.httpservletを拡張しますjavax.servlet.servlet {static final long serialversionuid = 1l; public voidサービス(httpservletrequest request、httpservletresponse応答)は、servletexception、ioexception {response.setheader( "pragma"、 "no-cache")をthrows servletexceptionにスローします。 Response.setheader( "Cache-Control"、 "no-cache"); Response.setDateHeader( "Expires"、0); Response.setContentType( "Image/jpeg"); //ランダムな文字列verifyCode = verifyCodeutils.genereverifyCode(4);を生成します。 //セッションセッションhttpsession session = request.getSession(true); session.setattribute( "rand"、verifycode.tolowercase()); //画像を生成int w = 200、h = 80; verifyCodeutils.Outputimage(w、h、response.getOutputStream()、verifyCode); }} VerifyCodeutilsクラス
パッケージhh.com.util; java.awt.color;インポート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.afiNeTransfinth; java.awt.image.bufferedimage; import java.io.file; Import java.io.fileoutputStream; Import java.io.ioexception; Import java.outputStream; Import Java.util.Arrays; Import Java.util.random; javax.imageio.imageioをインポートします。 Public Class verifyCodeutils {// Algerian Fontを使用します。システムにない場合、フォントは大文字を表示するだけで、1,0、i、o public static final string verify_codes = "23456789ABCDEFGHJKLMNPQRSTUVWXYZ"; private static random = new Random(); / ***デフォルトの文字ソースを使用して検証コードを生成します* @param verifysize検証コード長*/ public static string generateverifycode(int verifysize、verify_codes); } / ***指定されたソースを使用して検証コードを生成します* @param Verifysize検証コード長* @paramソース検証コードソース* @return* / public static string generateverifycode(int verifysize、string sources){if(sources == null || null || sources.length()= 0){areces = verify_codes; } 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(); } / ** *ランダムな検証コードファイルを生成し、検証コード値を返します * @param w * @param h * @param outputfile * @param verifysize * @return * @throws ioexception * / public static string outputverimage(int w、int h、file outputfile、int verifysize) outputimage(w、h、outputfile、verifyCode); VerifyCodeを返します。 } / ** *ランダムな検証コード画像ストリームを出力して確認コード値を返します * @param w * @param h * @param os * @param verifysize * @return * @throws ioexception * / public static string outputveriyimage(int w、int h、outputstream os、int verifysize) outputimage(w、h、os、verifycode); VerifyCodeを返します。 } / ** *指定された検証コード画像ファイル * @param W * @param h * @param outputfile * @param code * @throws ioexception * / public static void outputimage(int w、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){shop e; }} / ** *指定された検証コード画像ストリーム * @param w * @param h * @param os * @param code * @throws ioexception * / public static void outputimage(int w、int h、outputstream os、string code)throws 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); color [] colors = new color [5]; 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)]; fractions [i] = rand.nextfloat(); } arrays.sort(fractions); g2.setcolor(color.gray); //境界線色g2.fillrect(0、0、w、h); Color C = GetRandColor(200、250); g2.setcolor(c); //背景色g2.fillrect(0、2、w、h-4); //干渉ラインを描画しますランダム= 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); } //ノイズフロートヨープレート= 0.05f; //ノイズレートint area =(int)(yawprate * w * h); for(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); //画像g2.setcolor(getRandColor(100、160))を歪めます。 int fontsize = h-4; font font = new font( "algerian"、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 + 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); } 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);新しい色(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を返します。 } private static void shear(Graphics G、int W1、int h1、color Color){shearx(g、w1、h1、color); sheary(g、w1、h1、color); } private static void shearx(Graphics G、int W1、int h1、color Color){int rivers = random.nextint(2); Boolean bordergap = true; int frames = 1; int phase = random.nextint(2); for(int i = 0; i <h1; i ++){double d =(double)(double)(period >> 1) * math.sin((double)i /(double)期間+(6.2831853071795862d *(double)fase) /(double)frames); 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){int period = random.nextint(40) + 10; // 50; Boolean bordergap = true; intフレーム= 20; int phase = 7; for(int i = 0; i <w1; i ++){double d =(double)(double)(period >> 1) * math.sin((double)i /(double)期間+(6.2831853071795862d *(double)fase) /(double)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)throws 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、file、verifycode); }}} web.xml構成:
<サーブレット> servlet-name> authimage </servlet-name> <servlet-class> hh.com.util.authimage </servlet-class> </servlet> <servlet-name> authimage </servlet-name> <url-pattern>/authimage </url-pattern> </servet-mapping>
上記はこの記事に関するすべてです。 Java画像検証コードを学ぶことがあなたにインスピレーションを与えることを願っています。