أولاً ، دعنا نلقي نظرة على كيفية إنشاء رمز التحقق من الصورة محليًا ، ثم اكتب إخراج رمز التحقق إلى صفحة الويب لتنفيذها.
دعونا أولاً نلقي نظرة على أبسط وظيفة - التنفيذ هو تحويل السلسلة إلى صورة وكتابتها إلى ملف.
رمز التنفيذ:
package cn.hncu.img ؛ import java.awt.graphics ؛ import java.awt.image.bufferedImage ؛ import java.io.filenotfoundexception ؛ import java.io.fileOutputStream ؛ استيراد java.io.ioException ؛ وأداء تشفير وفك تشفير بسيط. استيراد org.junit.test ؛ الفئة العامة imgdemo {// تعلم كيفية تحويل سلسلة إلى صورة والكتابة إلى ملف @test public void imgdemo1 () remenotfoundexception ، ioException {bufferedImage Img = جديد bufferedimage (60 ، 30 ، bufferedimage.type_int_rgb) ؛ // يمثل صورة تحتوي على مكونات ألوان RGB ذات 8 بت من بكسل عدد صحيح صناعي. الرسومات g = img.getGraphics () ؛ G.DrawString ("Hello" ، 10،20) ؛ // ارسم النص المقدم من السلسلة المحددة باستخدام الخط الحالي ولون هذا السياق الرسم. يقع خط الأساس للشخصية في أقصى اليسار في الموضع (x ، y) لنظام إحداثيات سياق الرسم البياني هذا. G.Dispose () ؛ /// على غرار الإغلاق () في الدفق ، فإنه يدفع Flush () --- يومض البيانات في كائن IMG // يطلق سياق هذا الرسم البياني وجميع موارد النظام التي يستخدمها. بعد استدعاء التخلص ، لم يعد بإمكانك استخدام كائن الرسومات. imageio.write (IMG ، "JPG" ، FileOutputStream جديد ("IMG/A.JPG")) ؛ // اكتب صورة للملف باستخدام أي صورة ImageWriter تدعم التنسيق المحدد. }}نتيجة:
ما سبق بسيط للغاية ، أليس كذلك؟ رمز التحقق الذي نراه ليس هكذا. حسنًا ، دعنا نضيف بعض خطوط التداخل ولون الخلفية والأحرف والإحداثيات Y.
رمز التحقق مع خطوط التداخل وألوان الخلفية - اكتب إلى ملف
الرمز التجريبي:
package cn.hncu.img ؛ import java.awt.color ؛ import java.awt.font ؛ import java.awt.graphics ؛ import java.awt.image.bufferedImage ؛ import java.ioio java.util.random ؛ import javax.imageio.imageio ؛ // تحتوي هذه الفئة على بعض الأشياء المستخدمة للعثور على قائد التصوير وكتابة الصور والأساليب الساكنة والرائعة لأداء الترميز والتشفير البسيط. استيراد org.junit.test ؛ الفئة العامة IMGDEMO {// قم بتغيير السلسلة أعلاه إلى رمز التحقق الذي نستخدمه عادةً - قم بإنشاء عدة أرقام عشوائية ، مع خطوط خلفية وخطوط التداخل @Test Public void imgdemo2 () remingfoundException ، ioException {int -width = 80 ؛ ارتفاع int = 40 ؛ خطوط int = 10 ؛ BufferedImage IMG = جديد bufferedImage (العرض ، الارتفاع ، bufferedImage.type_int_rgb) ؛ الرسومات g = img.getGraphics () ؛ // اضبط لون الخلفية G.SetColor (color.hite) ؛ G.FillRect (0 ، 0 ، العرض ، الارتفاع) ؛ // ارسم الخلفية // املأ المستطيل المحدد. املأ المستطيل باللون الحالي لسياق الرسوم // قم بتعيين الخط G.SetFont (خط جديد ("宋体" ، font.bold ، 18)) ؛ // تاريخ العشوائي D = تاريخ جديد () ؛ //system.out.println (D.GetTime ()) ؛ عشوائي R = جديد عشوائي (D.GetTime ()) ؛ لـ (int i = 0 ؛ i <4 ؛ i ++) {int a = r.nextint (10) ؛ // يرجى عدد صحيح خلال 10 [0 ، 9] int y = 10+r.nextint (20) ؛ // عددًا صحيحًا في النطاق 10 ~ 30 ، كألوان تنسيق y = لون جديد (R.NextInt (255) ، R.Nextint (255) ، R.Nextint (255)) ؛ G.SetColor (C) ؛ G.DrawString (""+a ، 5+i*width/4 ، y) ؛ } // خط التداخل لـ (int i = 0 ؛ i <lines ؛ i ++) {color c = new color (r.nextint (255) ، r.nextint (255) ، r.nextint (255)) ؛ G.SetColor (C) ؛ G.Drawline (R.NextInt (العرض) ، R.NextInt (الارتفاع) ، R.NextInt (العرض) ، R.NextInt (الارتفاع)) ؛ } g.dispose () ؛ // على غرار Close () في الدفق ، يدفع Flush () --- بيانات فلاش في كائن IMG Imageio.write (IMG ، "JPG" ، FileOutputStream ("IMG/B.JPG")) ؛ }}نتائج التوضيح:
أخيرًا ، دعونا نلقي نظرة على رمز التحقق الذي يمكن تدويره وتدوينه - اكتبه في الملف المحلي للصورة
الرمز التجريبي:
package cn.hncu.img ؛ import java.awt.color ؛ استيراد java.awt.font java.io.fileOutputStream ؛ استيراد java.io.ioException ؛ استيراد java.util.date ؛ استيراد java.util.random ؛ import javax.imageio.imageio ؛ استيراد org.junit.test ؛ الفئة العامة imgdemo { @test // رمز التحقق الذي يمكنه تدوير وتكبير public void imgdemo3 () يلقي FileNotfoundException ، ioException {int width = 80 ؛ ارتفاع int = 40 ؛ خطوط int = 10 ؛ BufferedImage IMG = جديد bufferedImage (العرض ، الارتفاع ، bufferedImage.type_int_rgb) ؛ graphics2d g2d = (graphics2d) img.getGraphics () ؛ g2d.setfont (خط جديد ("宋体" ، font.bold ، 20)) ؛ R Random R = New Random (Date (). GetTime ()) ؛ // اضبط لون الخلفية G2D.SetColor (لون جديد (R.NextInt (255) ، R.NextInt (255) ، R.Nextint (255))) ؛ G2D.DrawRect (0 ، 0 ، العرض ، الارتفاع) ؛ // ارسم حدود المستطيل المحدد. G2D.SetColor (New Color (R.NextInt (255) ، R.NextInt (255) ، R.NextInt (255))) ؛ G2D.FillRect (0 ، 0 ، العرض ، الارتفاع) ؛ // املأ المستطيل المحدد. لـ (int i = 0 ؛ i <4 ؛ i ++) {string str = ""+r.nextint (10) ؛ // معالجة الدوران AffinetRansform tx = AffinetRansform () جديد ؛ tx.rotate (Math.Random () ، 5+i*15 ، height-5) ؛ // زاوية الدوران المقاسة مع الراديان ، وإحداثي X من مرساة الدوران ، وإحداثي y لمرساة الدوران //tx.scale (0.7+Math.Random () ، 0.7+Math.Random ()) ؛ . Color C = New Color (R.NextInt (255) ، R.NextInt (255) ، R.NextInt (255)) ؛ G2D.SetColor (C) ؛ g2d.drawString (str ، 2+i*width/4 ، height-13) ؛ } // خط التداخل لـ (int i = 0 ؛ i <lines ؛ i ++) {color c = new color (r.nextint (255) ، r.nextint (255) ، r.nextint (255)) ؛ G2D.SetColor (C) ؛ G2D.Drawline (R.NextInt (العرض) ، R.NextInt (الارتفاع) ، R.NextInt (العرض) ، R.NextInt (الارتفاع)) ؛ } g2d.dispose () ؛ imageio.write (img ، "jpg" ، fileOutputStream جديد ("img/c.jpg")) ؛ }}نتائج التوضيح:
الآن سنبدأ في إظهار تقنية التحقق من صورة مكتب الاستقبال.
تقنية التحقق من صورة مكتب الاستقبال
مخطط هيكل هذا المشروع:
index.jsp:
<٪@ page language = "java" import = "java.util.*" pageencoding = "utf-8" ٪> <! doctype html public "-// w3c // dtd html 4.01 transitional // en"> <html> <script typ document.getElementById ("servletimg") ؛ var d = new Date () ؛ var time = d.getTime () ؛ // إذا لم يكن هناك هذا // لن تنجح الجملة التالية ، لأن تقنية التخزين المؤقت للمتصفح ، فلن يتم تحديث الصورة //img.src="/myhelloweb/servlet/servlet/impeservlet "؛ img.src = "/myhelloweb/servlet/imageservlet؟"+time ؛ // يتم تمرير الشيء وراء الرقم من خلال GET} </script> </head> <body> هذه هي صفحة الصفحة الرئيسية اليدوية! <br/> <img id = "servletimg" src = "/myhelloweb/servlet/imageservlet"/> <a href = "javaScript: Changimg ()"> غير واضح </a> </body> </html>web.xml:
<؟ XSI: schemalocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web- <Description> هذا هو وصف مكون J2EE الخاص بي </description> <name-name> هذا هو اسم العرض الخاص بمكون J2EE الخاص بي </display-name> <Sradlet-Name> pictureservlet </servlet-name> <cervlet-class> cn.hncu.img.imageservlet </servlet-class> <Url-pattern>/servlet/imageservlet </url-pattern> </servlet-mapping> <-list-file-lister> <lispile-file> index.jsp </iship-file> </self-file-list> </web-app>
صور Servlet.java
package cn.hncu.img ؛ import java.awt.color ؛ استيراد java.awt.font ؛ استيراد java.awt.graphics ؛ استيراد java.awt.image.bufferedimage ؛ javax.imageio.imageio ؛ استيراد javax.servlet.servletexception ؛ استيراد javax.servlet.http.httpservlet ؛ استيراد javax.servlet.http.httpservlet DOGE (طلب httpservletrequest ، استجابة httpservletresponse) يلقي servleTexception ، ioException {dopost (request ، response) ؛ } public void dopost (httpservletrequest request ، httpservletresponse) يلقي servletexception ، ioException {// أخبر العميل أن تنسيق الإخراج response.setContentType ("Image/JPEG") ؛ عرض int = 80 ؛ ارتفاع int = 40 ؛ خطوط int = 10 ؛ BufferedImage IMG = جديد bufferedImage (العرض ، الارتفاع ، bufferedImage.type_int_rgb) ؛ الرسومات g = img.getGraphics () ؛ // اضبط لون الخلفية G.SetColor (color.hite) ؛ G.FillRect (0 ، 0 ، العرض ، الارتفاع) ؛ // قم بتعيين الخط G.SetFont (خط جديد ("宋体" ، font.bold ، 20)) ؛ // عشوائي R = جديد عشوائي (تاريخ جديد (). getTime ()) ؛ لـ (int i = 0 ؛ i <4 ؛ i ++) {int a = r.nextint (10) ؛ int y = 10+r.nextint (20) ؛ // عددًا صحيحًا في النطاق 10 ~ 30 ، كون تنسق y C = لون جديد (R.NextInt (255) ، R.Nextint (255) ، R.Nextint (255)) ؛ G.SetColor (C) ؛ G.DrawString (""+a ، 5+i*width/4 ، y) ؛ } // خط التداخل لـ (int i = 0 ؛ i <lines ؛ i ++) {color c = new color (r.nextint (255) ، r.nextint (255) ، r.nextint (255)) ؛ G.SetColor (C) ؛ G.Drawline (R.NextInt (العرض) ، R.NextInt (الارتفاع) ، R.NextInt (العرض) ، R.NextInt (الارتفاع)) ؛ } g.dispose () ؛ // على غرار الإغلاق () في الدفق ، تدفق محرك الأقراص () --- بيانات فلاش في كائن IMG Imageio.write (IMG ، "JPG" ، desponse.getOutputStream ()) ؛ }}نتائج التوضيح:
فيما يلي في index.jsp:
إذا تم استخدام هذه الجملة:
img.src = "/myhelloweb/servlet/pictureservlet" ؛
يمكنك التحقق من رأس الاستجابة:
دعونا نلقي نظرة على رأس الاستجابة باستخدام هذه الجملة:
img.src = "/myhelloweb/servlet/pictureservlet؟"+time ؛
هناك استجابة تاريخ إضافية!
نظرًا لأن الوقت قد تغير ، في كل مرة أنقر فيها لرؤيته ، سأطلب منه الخادم مرة أخرى ، ولن أتوقف عن طلبه بسبب ذاكرة التخزين المؤقت للمتصفح.
ينتهي رمز التحقق هنا.
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.