Primero, echemos un vistazo a cómo generar el código de verificación de imágenes localmente, y luego escriba la salida del código de verificación en la página web para implementarlo.
Veamos primero la función más simple: la implementación es convertir una cadena en una imagen y escribirla en un archivo.
Código de implementación:
paquete cn.hncu.img; import java.awt.graphics; import java.awt.image.bufferedImage; import java.io.filenotfoundException; import java.io.fileOutputStream; import java.io.ioexception; import javax.imageio.imageio; // Esta clase contiene algunas estatales y convenientes para encontrar los métodos de imagen y conveniente para hallazgos; Realización de codificación y decodificación simples. importar org.junit.test; public class imgdemo {// Aprenda a convertir una cadena en una imagen y escribir en un archivo @test public void imgdemo1 () lanza FileNotFoundException, ioException {BufferedImage img = New BufferedImage (60, 30, BufferedImage.Type_int_Int_Int_Int_int_Int_Int_Int_Int_Int_Int_Int_Int_Int_Int_Int_Int_Int_Int_Int_Int_Int_Int_Int_Int_Int_Int_Int_Int_Int_Int_Int_Int_Int_Int_Int_Int_Int_Int_RGB); // representa una imagen con componentes de color RGB de 8 bits de píxeles enteros sintéticos. Gráficos g = img.getgraphics (); G.DrawString ("Hola", 10,20); // Dibuja el texto dado por la cadena especificada utilizando la fuente actual y el color de este contexto gráfico. La línea de base del carácter más a la izquierda se encuentra en la posición (x, y) de este sistema de coordenadas de contexto gráfico. G.Dispose (); //// Similar a Close () En la transmisión, impulsa FLUSH () --- Parpadea los datos en el objeto IMG // libera el contexto de este gráfico y todos los recursos del sistema que utiliza. Después de llamar a Dispose, ya no puede usar el objeto gráfico. ImageIO.Write (img, "jpg", nuevo fileOutputStream ("img/a.jpg")); // Escribir una imagen para archivar utilizando cualquier IMAGEWRITER que admita el formato dado. }}resultado:
Lo anterior es muy simple, ¿verdad? El código de verificación que vemos no es así. Ok, agregemos algunas líneas de interferencia, color de fondo, caracteres y coordenadas y.
Código de verificación con líneas de interferencia y colores de fondo: escriba en el archivo
Código de demostración:
paquete 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.fileOutputputTream; import java.io.ioxception; java.util.random; import javax.imageio.imageio; // Esta clase contiene algunos utilizados para encontrar ImageReader y ImageWriter y métodos estáticos y convenientes para realizar una codificación y decodificación simples. importar org.junit.test; public class imgdemo {// Cambie la cadena anterior en el código de verificación que usualmente usamos: genere varios números aleatorios, con color de fondo e líneas de interferencia @test public iMgdemo2 () lanza FileNotFoundException, ioexception {int width = 80; int altura = 40; Int Lines = 10; BufferedImage IMG = new BufferedImage (ancho, altura, bufferedimage.type_int_rgb); Gráficos g = img.getgraphics (); // establecer el color de fondo G.SetColor (color.white); G.Fillrect (0, 0, ancho, altura); // Dibuja el fondo // Llena el rectángulo especificado. Llene el rectángulo con el color actual del contexto gráfico // Establezca la fuente G.SetFont (nueva fuente ("宋体", Font.Bold, 18)); // fecha de número aleatorio d = nueva fecha (); //System.out.println (d.gettime ()); Random r = new Random (d.gettime ()); para (int i = 0; i <4; i ++) {int a = r.nextint (10); // Por favor, un entero dentro de 10 [0, 9] int y = 10+R.NextInt (20); // un entero en el rango 10 ~ 30, como el color de la coordenada y C = nuevo color (R.Nextint (255), R.NextInt (255), R.NextInt (255)); G.SetColor (C); G.DrawString (""+A, 5+I*ancho/4, y); } // línea de interferencia para (int i = 0; i <líneas; i ++) {color c = nuevo color (R.NextInt (255), R.NextInt (255), R.NextInt (255)); G.SetColor (C); G.Drawline (R.NextInt (ancho), R.NextInt (altura), R.NextInt (ancho), R.NextInt (altura)); } G.Dispose (); // Similar a Close () en la transmisión, impulsa los datos flash () en el objeto IMG ImageIO.Write (IMG, "JPG", nuevo FileOutputStream ("IMG/B.JPG")); }}Resultados de la demostración:
Finalmente, veamos un código de verificación que se puede girar y escalarse: escríbelo en el archivo local de la imagen
Código de demostración:
paquete 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.filenotfilenoccepción; importar; java.io.fileOutputStream; import java.io.ioexception; import java.util.date; import java.util.random; import javax.imageio.imageio; // Esta clase contiene algunos métodos estáticos y convenientes para encontrar imágenes y imágenes de imágenes y actuar de forma simple y decodificación. importar org.junit.test; public class imgdemo { @test // código de verificación que puede rotar y zoom public void imgdemo3 () lanza FileNotFoundException, ioException {int width = 80; int altura = 40; Int Lines = 10; BufferedImage IMG = new BufferedImage (ancho, altura, bufferedimage.type_int_rgb); Graphics2d g2d = (Graphics2d) img.getGraphics (); g2d.setFont (nueva fuente ("宋体", fuente. Bolde, 20)); Aleatorio r = new Random (nueva fecha (). GetTime ()); // Establecer el color de fondo G2D.SetColor (nuevo color (R.Nextint (255), R.Nextint (255), R.NextInt (255))); g2d.drawrect (0, 0, ancho, altura); // Dibuja el borde del rectángulo especificado. G2D.SetColor (nuevo color (R.Nextint (255), R.Nextint (255), R.NextInt (255))); g2d.fillrect (0, 0, ancho, altura); // Llena el rectángulo especificado. for (int i = 0; i <4; i ++) {String str = ""+R.NextInt (10); // Procesamiento de rotación Affinetransform tx = new Affinetransform (); Tx.rotate (math.random (), 5+i*15, altura-5); // El ángulo de rotación medido con radianes, la coordenada x del ancla de rotación y la coordenada y del ancla de rotación //tx.scale (0.7+math.random (), 0.7+math.random ()); // El múltiplo de escala en la dirección de la coordenada x, el múltiplo de escala en la dirección de coordenadas y g2d.setTransform (tx); Color C = nuevo color (R.Nextint (255), R.Nextint (255), R.Nextint (255)); G2D.SetColor (C); g2d.drawstring (str, 2+i*ancho/4, altura-13); } // línea de interferencia para (int i = 0; i <líneas; i ++) {color c = nuevo color (R.NextInt (255), R.NextInt (255), R.NextInt (255)); G2D.SetColor (C); G2d.Drawline (R.NextInt (ancho), R.NextInt (altura), R.NextInt (ancho), R.NextInt (altura)); } g2d.dispose (); ImageIO.Write (img, "jpg", nuevo fileOutputStream ("img/c.jpg")); }}Resultados de la demostración:
Ahora comenzaremos a demostrar la tecnología de verificación de imagen de recepción.
Tecnología de verificación de imágenes de recepción
Diagrama de estructura de este proyecto:
index.jsp:
<%@ page lenguaje = "java" import = "java.util.*" PageEncoding = "UTF-8"%> <! DocType html público "-// w3c // dtd html 4.01 transitional // en"> <html> <HEAD> <scry tipo = "text/javaScript"> function changimg () {Vari document.getElementById ("servletimg"); var d = nueva fecha (); var tiempo = d.gettime (); // Si no hay esto // la siguiente oración no funcionará, porque la tecnología de almacenamiento en caché del navegador, la imagen no se actualizará //img.src="/myhelloweb/servlet/imageServlet "; img.src = "/myhelloweb/servlet/imageservlet?"+time; // La cosa detrás del número se pasa a través de Get} </script> </head> <body> ¡Esta es mi página de inicio manual! <br/> <img id = "servletimg" src = "/myhelloweb/servlet/imageservlet"/> <a href = "javaScript: changimg ()"> Un claro </a> </body> </html>web.xml:
<? xml versión = "1.0" encoding = "utf-8"?> <web-app versión = "3.0" xmlns = "http://java.sun.com/xml/ns/javaee" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xsi: schemalocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaeeee/web-app_3_0.xsd"> <jageN <Scuion> Esta es la descripción de mi componente J2EE </description> <Spant-Name> Este es el nombre de visualización de mi componente J2EE </display-name> <Servlet-name> ImageServlet </servlet-name> <ervlet-class> cn.hncu.img.imageservlet </servlet-class> </servlet> <ervlet-mapping> <servlet-name> Imagessurtlet </servlet> servlet> <Url-Pattern>/Servlet/ImageServlet </url-Pattern> </servlet-mapping> <begue-file-list> <beating-file> index.jsp </ welcome-file> </welcome-filist> </beb-app>
ImageServlet.java
paquete cn.hncu.img; import java.awt.color; import java.awt.font; import java.awt.graphics; import java.awt.image.bufferedImage; import java.io.ioexception; import java.io.io.i javax.Imageio.Imageio; import javax.servlet.servletException; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletRequest; import javax.servlet.http.httpservletRePonse; public classServlet ExtendsSquest; doget (httpservletRequest solicitud, respuesta httpservletreSponse) arroja servletException, ioexception {dopost (solicitud, respuesta); } public void dopost (httpservletRequest solicitud, respuesta httpservletreSponse) lanza ServletException, ioexception {// le diga al cliente que el formato de salida responde.setContentType ("Image/jpeg"); int ancho = 80; int altura = 40; Int Lines = 10; BufferedImage IMG = new BufferedImage (ancho, altura, bufferedimage.type_int_rgb); Gráficos g = img.getgraphics (); // establecer el color de fondo G.SetColor (color.white); G.Fillrect (0, 0, ancho, altura); // establece la fuente G.SetFont (nueva fuente ("宋体", font.bold, 20)); // aleatorio random r = new Random (new Date (). GetTime ()); para (int i = 0; i <4; i ++) {int a = r.nextint (10); int y = 10+R.NextInt (20); // un entero en el rango 10 ~ 30, como el color de la coordenada y C = nuevo color (R.Nextint (255), R.NextInt (255), R.NextInt (255)); G.SetColor (C); G.DrawString (""+A, 5+I*ancho/4, y); } // La línea de interferencia para (int i = 0; i <líneas; i ++) {color c = nuevo color (R.NextInt (255), R.NextInt (255), R.NextInt (255)); G.SetColor (C); G.Drawline (R.NextInt (ancho), R.NextInt (altura), R.NextInt (ancho), R.NextInt (altura)); } G.Dispose (); // Similar a Close () en la transmisión, Drive FLUSH () --- Datos flash en el objeto IMG ImageIO.Write (IMG, "JPG", Response.getOutputStream ()); }}Resultados de la demostración:
Lo siguiente es en index.jsp:
Si se usa esta oración:
img.src = ”/myhelloweb/servlet/imageservlet”;
Puede verificar el encabezado de respuesta:
Echemos un vistazo al encabezado de respuesta usando esta oración:
img.src = ”/myhelloweb/servlet/imageservlet?”+Time;
¡Hay una respuesta de fecha extra!
Debido a que el tiempo ha cambiado, cada vez que hago clic para verlo, lo solicitaré nuevamente al servidor, y no dejaré de solicitarlo debido a la memoria caché del navegador.
El código de verificación termina aquí.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.