Primeiro, vamos dar uma olhada em como gerar código de verificação de imagem localmente e, em seguida, escreva a saída do código de verificação na página da web para implementá -lo.
Vamos primeiro olhar para a função mais simples - a implementação é transformar uma string em uma imagem e escrevê -la em um arquivo.
Código de implementação:
pacote cn.hncu.img; importar java.awt.graphics; importar java.awt.image.bufferedImage; importar java.io.fileNotfoundException; importar java.io.fileOutputStream; import java.io.ioxception; importação javax.imageio.imageio; e realizar codificação e decodificação simples. importar org.junit.test; classe pública imgdemo {// Aprenda a transformar uma string em uma imagem e gravar em um arquivo @test public void imgDemo1 () lança fileNotFoundException, ioexception {bufferImage img = newbredImage (60, 30, bufferImage.Type_Int. // representa uma imagem com componentes coloridos RGB de 8 bits de pixels inteiros sintéticos. Gráficos g = img.getgraphics (); G.DrawString ("Hello", 10,20); // Desenhe o texto fornecido pela sequência especificada usando a fonte atual e a cor deste contexto gráfico. A linha de base do caractere mais à esquerda está localizada na posição (x, y) deste sistema de coordenadas de contexto gráfico. G.Dispose (); //// Semelhante para fechar () no fluxo, ele aciona Flush () --- Flashes os dados no objeto IMG // libera o contexto deste gráfico e todos os recursos do sistema que ele usa. Depois de ligar para o Dispon, você não pode mais usar o objeto gráfico. Imageio.write (img, "jpg", new FileOutputStream ("img/a.jpg")); // Escreva uma imagem para arquivar usando qualquer ImageWriter que suporta o formato fornecido. }}resultado:
O acima é muito simples, certo? O código de verificação que vemos não é assim. Ok, vamos adicionar algumas linhas de interferência, cor de fundo, caracteres e coordenadas Y.
Código de verificação com linhas de interferência e cores de fundo - gravar no arquivo
Código de demonstração:
pacote cn.hncu.img; importar java.awt.color; importar java.awt.font; importar java.awt.graphics; importar java.awt.image.bufferiMage; importação java.io.filenotfoundception; importação java.io.FileOutPrince; importesenio; importSextReamio; java.util.random; importar javax.Imageio.imageio; // Esta classe contém alguns usados para encontrar o ImageReader e ImageWriter e métodos estáticos e convenientes para realizar codificação e decodificação simples. importar org.junit.test; classe pública imgdemo {// altere a string acima no código de verificação que geralmente usamos - gerar vários números aleatórios, com linhas de cor e interferência de fundo @test public void imgdemo2 () lança filenotfoundException, ioexception {int largura = 80; int altura = 40; int linhas = 10; BufferImage img = new bufferImage (largura, altura, bufferImage.type_int_rgb); Gráficos g = img.getgraphics (); // defina a cor do fundo G.SetColor (color.white); g.fillRect (0, 0, largura, altura); // desenhe o fundo // preencha o retângulo especificado. Preencha o retângulo com a cor atual do contexto gráfico // Defina a fonte G.SetFont (new Font ("宋体", Font.Bold, 18)); // Data do número aleatório d = new Date (); //System.out.println (d.gettime ()); Aleatório r = novo aleatório (d.gettime ()); for (int i = 0; i <4; i ++) {int a = r.nextint (10); // por favor, um número inteiro dentro de 10 [0, 9] int y = 10+r.nextint (20); // Um número inteiro no intervalo de 10 ~ 30, como a cor coordenada y c = nova cor (R.NextInt (255), R.Nextint (255), R.Nextint (255)); g.setColor (c); G.DrawString (""+A, 5+I*Width/4, y); } // linha de interferência para (int i = 0; i <linhas; i ++) {color c = nova cor (r.nextint (255), r.nextint (255), r.nextint (255)); g.setColor (c); G.Drawline (R.NextInt (Width), R.NextInt (altura), R.Nextint (Width), R.Nextint (altura)); } g.dispose (); // semelhante a fechar () no fluxo, drives Flush () --- Flash dados no objeto img imageio.write (img, "jpg", new FileOutputStream ("img/b.jpg"); }}Resultados da demonstração:
Por fim, vamos olhar para um código de verificação que pode ser girado e escalado - escreva -o no arquivo local da imagem
Código de demonstração:
pacote cn.hncu.img; importar java.awt.color; importar java.awt.font; importar java.awt.Graphics; importar java.awt.graphics2d; import java.bucered.port.geom.affineTransform; import.ilava.awtio.imageOnTimage; Importimage; java.io.fileOutputStream; importar java.io.ioexception; importar java.util.date; importar java.util.random; importar javax.imageio.imageio; // Esta classe contém alguns métodos estáticos e convenientes para encontrar imagens e imagens e atualização de imagens e execução simples e decodificando. importar org.junit.test; classe pública imgdemo { @test // código de verificação que pode girar e zoom public void imgDemo3 () lança fileNotfoundException, ioexception {int width = 80; int altura = 40; int linhas = 10; BufferImage img = new bufferImage (largura, altura, bufferImage.type_int_rgb); Graphics2d G2D = (Graphics2d) img.getgraphics (); g2d.setFont (nova fonte ("宋体", font.bold, 20)); Aleatório r = novo aleatório (new date (). Gettime ()); // Defina a cor do fundo G2D.setColor (nova cor (R.Nextint (255), R.Nextint (255), R.Nextint (255)); g2d.DrawRect (0, 0, largura, altura); // Desenhe a borda do retângulo especificado. g2d.setColor (New Color (R.NextInt (255), R.Nextint (255), R.Nextint (255))); g2d.fillRect (0, 0, largura, altura); // preencha o retângulo especificado. for (int i = 0; i <4; i ++) {string str = ""+r.nextint (10); // Processando rotação afinetransform tx = new AffineTransform (); Tx.rotate (Math.Random (), 5+i*15, altura-5); // O ângulo de rotação medido com radianos, a coordenada x da âncora de rotação e a coordenada y da âncora de rotação //tx.scale (0,7+math.random (), 0.7+math.random ()); // o múltiplo de escala na direção de coordenadas X, o múltiplo de escala na direção de coordenada y G2D.SetTransform (TX); Cor C = nova cor (R.Nextint (255), R.Nextint (255), R.Nextint (255)); g2d.setColor (c); G2D.DrawString (str, 2+i*largura/4, altura-13); } // linha de interferência para (int i = 0; i <linhas; i ++) {color c = nova cor (r.nextint (255), r.nextint (255), r.nextint (255)); g2d.setColor (c); G2D.DRAWLINE (R.NextInt (Width), R.Nextint (altura), R.NextInt (Width), R.Nextint (altura)); } g2d.dispose (); Imageio.write (img, "jpg", new FileOutputStream ("img/c.jpg")); }}Resultados da demonstração:
Agora começaremos a demonstrar a tecnologia de verificação da imagem da recepção.
Tecnologia de verificação da imagem da recepção
Diagrama de estrutura deste projeto:
index.jsp:
<%@ página linguagem = "java" import = "java.util.*" PageEncoding = "utf-8"%> <! document.getElementById ("servletimg"); var d = new Date (); var time = d.getTime (); // Se não houver essa // a frase a seguir não funcionará, porque a tecnologia de cache do navegador, a imagem não será atualizada //img.src="/myhelloweb/servlet/imageverlet "; img.src = "/myhelloweb/servlet/imagervlet?"+time; // A coisa por trás do número é passada por Get} </SCRIPT> </ad Head> <Body> Esta é a minha página inicial manual! <br/> <img id = "servletimg" src = "/myhelloweb/servlet/imagavlet"/> <a href = "javascript: changimg ()"> clare </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-instance" 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"> <display-name></display-name> <Verlet> <cription> Esta é a descrição do meu componente j2ee </cription> <lame-name> Este é o nome de exibição do meu componente j2ee </sisiber-name> <Servlet-name> imagensVetlet </servlet-name> </servlet-class> cn.hncu.img.imageslet </serag-class> </Servlet> <url-pattern>/servlet/Imageservlet </url-tattern> </servlet-mapping> <lorde-fil-list> <lmed-File> index.jsp </ld Welcome-File>
Imageservlet.java
pacote cn.hncu.img; importar java.awt.color; importar java.awt.font; importar java.awt.Graphics; importar java.awt.image.bufferImage; import java.io.ioException; importar java.io.printwriter; importandRa.util.Da.Dil.Oxception; importar java.IntWriter; javax.Imageio.Imageio; importar javax.servlet.servletexception; importar javax.servlet.http.httpServlet; importar javax.servlet.http.httPervLestRestleTReQuest; Imagertlet.ervlet.LettT.HTPSTLeOrTRestRestRestleTSond; Doget (solicitação httpServletRequest, httpServletResponse Response) lança servletexception, ioexception {dopost (solicitação, resposta); } public void DoPost (solicitação httpServletRequest, resposta httpSertletResponse) lança servletexception, ioexception {// diga ao cliente que o formato de saída Response.setContentType ("imagem/jpeg"); int width = 80; int altura = 40; int linhas = 10; BufferImage img = new bufferImage (largura, altura, bufferImage.type_int_rgb); Gráficos g = img.getgraphics (); // defina a cor do fundo G.SetColor (color.white); G.FillRect (0, 0, largura, altura); // Defina a fonte G.SetFont (new Font ("宋体", font.bold, 20)); // aleatório aleatório r = novo aleatório (new date (). Gettime ()); for (int i = 0; i <4; i ++) {int a = r.nextint (10); int y = 10+r.nextint (20); // um número inteiro no intervalo de 10 ~ 30, como a cor coordenada y c = nova cor (r.nextint (255), r.nextint (255), r.nextint (255)); g.setColor (c); G.DrawString (""+A, 5+I*Width/4, y); } // A linha de interferência para (int i = 0; i <linhas; i ++) {color c = nova cor (r.nextint (255), r.nextint (255), r.nextint (255)); g.setColor (c); G.Drawline (R.NextInt (Width), R.NextInt (altura), R.Nextint (Width), R.Nextint (altura)); } g.dispose (); // semelhante a fechar () no fluxo, drive flush () --- dados flash no objeto img imageio.write (img, "jpg", resposta.getOutstream ()); }}Resultados da demonstração:
O seguinte está em index.jsp:
Se esta frase for usada:
img.src = ”/myhelloweb/servlet/imagervlet”;
Você pode verificar o cabeçalho da resposta:
Vamos dar uma olhada no cabeçalho da resposta usando esta frase:
img.src = ”/myHelloweb/servlet/ImagesVlet?”+Time;
Há uma resposta extra de data!
Como o tempo está mudando, toda vez que clico para vê -lo, solicitarei o servidor novamente e não pararei de solicitá -lo por causa do cache do navegador.
O código de verificação termina aqui.
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.