Tout d'abord, examinons comment générer le code de vérification d'image localement, puis écrivons la sortie du code de vérification sur la page Web pour l'implémenter.
Examinons d'abord la fonction la plus simple - l'implémentation consiste à transformer une chaîne en une image et à l'écrire dans un fichier.
Code d'implémentation:
package cn.hncu.img; importer java.awt.graphics; import java.awt.image.bufferedImage; import java.io.filenotfoundException; importer java.io.fileoutputStream; import java.io.ioexception; import javax.imageio.imageio; // Cette classe contient quelques méthodes statiques et conçu effectuer un codage et un décodage simples. import org.junit.test; classe publique imgdemo {// apprenez à transformer une chaîne en image et à écrire dans un fichier @test public void imgdemo1 () lève filenotfoundException, ioException {buttereDimage img = new buttereDimage (60, 30, buffredimage.type_int_rgb); // représente une image avec des composants de couleur RVB 8 bits de pixels entiers synthétiques. Graphiques g = img.getGraphics (); G.Drawstring ("Hello", 10,20); // dessine le texte donné par la chaîne spécifiée en utilisant la police actuelle et la couleur de ce contexte graphique. La ligne de base du caractère le plus à gauche est située à la position (x, y) de ce système de coordonnées de contexte de graphique. g.dispose (); //// similaire à close () dans le flux, il entraîne Flush () --- clignote les données dans l'objet IMG // libère le contexte de ce graphique et toutes les ressources système qu'il utilise. Après l'appel Disser, vous ne pouvez plus utiliser l'objet graphique. Imageo.write (img, "jpg", new FileOutputStream ("img / a.jpg")); // Écrivez une image dans un fichier à l'aide de n'importe quel ImageWriter qui prend en charge le format donné. }}résultat:
Ce qui précède est très simple, non? Le code de vérification que nous voyons n'est pas comme ça. Ok, ajoutons quelques lignes d'interférence, couleur d'arrière-plan, caractères et coordonnées Y.
Code de vérification avec lignes d'interférence et couleurs d'arrière-plan - Écrivez dans le fichier
Code de démonstration:
Package cn.hncu.img; import java.awt.color; import java.awt.font; import java.awt.graphics; import java.awt.image.bufferedImage; import java.io.filenotfoundException; import java.io.fileoutStream; import java.io.ioexception; import java. java.util.random; Importer javax.imageio.imageio; // Cette classe contient certains utilisés pour trouver ImageReader et ImageWriter et des méthodes statiques et pratiques pour effectuer un codage et un décodage simples. import org.junit.test; classe publique imgdemo {// modifie la chaîne ci-dessus en code de vérification que nous utilisons habituellement - générer plusieurs nombres aléatoires, avec des lignes d'arrière-plan et des lignes d'interférence @Test public void imgdemo2 () lève filenotfoundException, ioException {int width = 80; int hauteur = 40; lignes int = 10; BufferedImage IMG = new BufferedImage (largeur, hauteur, bufferedImage.type_int_rgb); Graphiques g = img.getGraphics (); // Définit la couleur d'arrière-plan g.setColor (Color.white); G.Fillrect (0, 0, largeur, hauteur); // dessiner l'arrière-plan // Remplissez le rectangle spécifié. Remplissez le rectangle de la couleur actuelle du contexte graphique // Définissez la police g.setfont (nouvelle police ("宋体", font.bold, 18)); // Date de nombre aléatoire D = new Date (); //System.out.println (D.GetTime ()); Random r = new Random (d.GetTime ()); pour (int i = 0; i <4; i ++) {int a = r.nextint (10); // s'il vous plaît un entier dans les 10 [0, 9] int y = 10 + r.Nextint (20); // un entier dans la plage de 10 ~ 30, comme la couleur de coordonnée y C = nouvelle couleur (R.Nextint (255), R.Nextint (255), R.Nextint (255)); g.setColor (c); G.Drawstring ("" + a, 5 + i * largeur / 4, y); } // ligne d'interférence pour (int i = 0; i <lignes; i ++) {couleur c = new Color (R.Nextint (255), r.Nextint (255), R.Nextint (255)); g.setColor (c); G.Drawline (R.Nextint (Width), R.Nextint (Height), R.Nextint (largeur), R.Nextint (hauteur)); } g.dispose (); // similaire à Close () Dans le flux, Drive Flush () --- Flash Données dans l'objet IMG ImageIo.Write (IMG, "JPG", nouveau FileOutputStream ("IMG / B.JPG")); }}Résultats de la démonstration:
Enfin, regardons un code de vérification qui peut être tourné et mis à l'échelle - écrivez-le dans le fichier local de l'image
Code de démonstration:
Package CN.HNCU.IMG; IMPORT JAVA.AWT.COLOR; IMPORT JAVA.AWT.FONT; IMPORT JAVA.AWT.GRAPHICS; IMPORT JAVA.AWT.GRAPHICS2D; IMPORT JAVA.AWT.GEOM.AFFINETRANSFORM; IMPORT Java.awt.image.BufferedImage; Import Java.io.filenotfoundexception; java.io.fileOutputStream; import java.io.ioException; import java.util.date; import java.util.random; import javax.imageio.imageio; // Cette classe contient des méthodes statiques et pratiques pour trouver l'imageReader et l'imagewriter et effectuer un encodage simple et décodage. import org.junit.test; classe publique imgdemo {@ test // code de vérification qui peut rotatif et zoom public void imgdemo3 () lève filenotfoundException, ioException {int width = 80; int hauteur = 40; lignes int = 10; BufferedImage IMG = new BufferedImage (largeur, hauteur, bufferedImage.type_int_rgb); Graphics2d g2d = (graphics2d) img.getGraphics (); g2d.setfont (nouvelle police ("宋体", font.bold, 20)); Random r = new Random (new Date (). GetTime ()); // Définit la couleur d'arrière-plan g2d.setColor (New Color (R.Nextint (255), R.Nextint (255), R.Nextint (255))); g2d.Drawrect (0, 0, largeur, hauteur); // dessine la bordure du rectangle spécifié. G2d.setColor (New Color (R.Nextint (255), R.Nextint (255), R.Nextint (255))); G2d.Fillrect (0, 0, largeur, hauteur); // Remplissez le rectangle spécifié. pour (int i = 0; i <4; i ++) {String str = "" + r.Nextint (10); // Traitement Rotation AffineTransform Tx = new AffineTransform (); Tx.rotate (math.random (), 5 + i * 15, hauteur-5); // l'angle de rotation mesuré avec des radians, la coordonnée x de l'ancre de rotation et la coordonnée y de l'ancre de rotation //tx.scale (0,7 + math.random (), 0,7 + math.random ()); // le multiple de mise à l'échelle dans la direction de la coordonnée x, le multiple de mise à l'échelle dans la direction de la coordonnée y g2d.settransform (TX); Couleur C = nouvelle couleur (R.Nextint (255), R.Nextint (255), R.Nextint (255)); g2d.setColor (c); g2d.Drawstring (str, 2 + i * largeur / 4, hauteur-13); } // ligne d'interférence pour (int i = 0; i <lignes; i ++) {couleur c = new Color (R.Nextint (255), r.Nextint (255), R.Nextint (255)); g2d.setColor (c); G2d.Drawline (R.Nextint (largeur), R.Nextint (hauteur), R.Nextint (largeur), R.Nextint (hauteur)); } g2d.dispose (); Imageo.write (img, "jpg", new fileoutputStream ("img / c.jpg")); }}Résultats de la démonstration:
Nous allons maintenant commencer à démontrer la technologie de vérification de l'image de la réception.
Technologie de vérification de l'image de la réception
Diagramme de structure de ce projet:
index.jsp:
<% @ page Language = "Java" import = "java.util. *" Pageencoding = "utf-8"%> <! doctype html public "- // w3c // dtd html 4.01 transitional // en"> <html> document.getElementById ("servletimg"); var d = new Date (); var time = d.getTime (); // S'il n'y a pas de cette // la phrase suivante ne fonctionnera pas, car la technologie de mise en cache du navigateur, l'image ne sera pas actualisée //img.src="/myhelloweb/servlet/imageservlet "; img.src = "/ myHelloweb / servlet / imagesvlet?" + time; // La chose derrière le numéro est passé par get} </cript> </adre> <body> Ceci est ma page d'accueil manuelle! <br/> <img id = "servletimg" src = "/ myHelloweb / servlet / imagesvlet" /> <a href = "javascript: changiMg ()"> clairs </a> </ body> </html>web.xml:
<? xml version = "1.0" encoding = "utf-8"?> <web-app version = "3.0" xmlns = "http://java.sun.com/xml/ns/javaee" xmlns: xsi = "http://www.w3.org/2001/xmlschema-ristance" XSI: ScheMalocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <plaw-name> <escription> Ceci est la description de mon composant J2EE </ Description> <Display-Name> Ceci est le nom d'affichage de mon composant J2EE </ Display-Name> <Servlet-Name> Imagesservlet </ Servlet-Name> <Servlet-Class> CN.hncu.img.imageservlet </ Servlet-Class> </servlet> <Servlet Mapping> <Serplet-Name> Imagesservlet> </servlet> <Servlet Mapping> <Serplet-Name> ImageServlet> </servlet> <Servlet Mapping> <Serplet-Name> ImageServlet> </servlet> <Servlet Mapping> <Serplet-Name> Imagesservlet> </servlet> <SERVLET-MOPPORD> <Arservlet-Name> <URL-Pattern> / Servlet / ImagesVlet </url-Pattern> </ Servlet-Mapping> <Welcome-File-List> <Deen welcome-File> index.jsp </ Welcome-File> </ Welcome-File-List> </ Web-App>
Imagesvlet.java
Package cn.hncu.img; import java.awt.color; importer java.awt.font; import java.awt.graphics; import java.awt.image.bufferedImage; import java.io.ioexception; import java.io.printwriter; import java.util.date; import java.utitil.randoM; javax.imageio.imageio; Importer javax.servlet.servletException; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletRequest; DOGT (HttpServLetRequest Request, HttpServletResponse Response) lève ServletException, ioException {doPost (request, réponse); } public void doPost (requête httpsservletRequest, réponse httpservletResponse) lève ServletException, ioException {// dire au client que le format de sortie a réponse.setContentType ("image / jPEG"); Int largeur = 80; int hauteur = 40; lignes int = 10; BufferedImage IMG = new BufferedImage (largeur, hauteur, bufferedImage.type_int_rgb); Graphiques g = img.getGraphics (); // Définit la couleur d'arrière-plan g.setColor (Color.white); G.Fillrect (0, 0, largeur, hauteur); // Définit la police g.setfont (nouvelle police ("宋体", font.bold, 20)); // aléatoire aléatoire r = nouveau aléatoire (new Date (). GetTime ()); pour (int i = 0; i <4; i ++) {int a = r.nextint (10); int y = 10 + r.Nextint (20); // un entier dans la plage de 10 ~ 30, comme la couleur des coordonnées y c = nouvelle couleur (R.Nextint (255), R.Nextint (255), R.Nextint (255)); g.setColor (c); G.Drawstring ("" + a, 5 + i * largeur / 4, y); } // la ligne d'interférence pour (int i = 0; i <lignes; i ++) {couleur c = new Color (R.Nextint (255), r.Nextint (255), R.Nextint (255)); g.setColor (c); G.Drawline (R.Nextint (Width), R.Nextint (Height), R.Nextint (largeur), R.Nextint (hauteur)); } g.dispose (); // similaire à Close () Dans le flux, Drive Flush () --- Flash Données dans l'image IMG ImageIo.Write (IMG, "JPG", Response.getOutputStream ()); }}Résultats de la démonstration:
Ce qui suit est dans index.jsp:
Si cette phrase est utilisée:
img.src = ”/ myHellowEb / servlet / imagesvlet”;
Vous pouvez vérifier l'en-tête de réponse:
Jetons un coup d'œil à l'en-tête de réponse en utilisant cette phrase:
img.src = ”/ myHellowEb / servlet / imagesvlet?" + time;
Il y a une réponse de date supplémentaire!
Parce que le temps a changé, chaque fois que je clique pour le voir, je le demanderai à nouveau au serveur, et je n'arrêterai pas de le demander en raison du cache du navigateur.
Le code de vérification se termine ici.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.