Enseñarte paso a paso usando el diseño Java para generar códigos QR
En la era de Internet de las cosas, los códigos QR son algo muy importante. Ahora, no importa lo que sea, debe obtener un logotipo de código QR. Por miedo a estar desactualizado, no puede usar el código QR para identificarlo. Tal vez algún día el certificado de nacimiento o el libro de registro del hogar se identifiquen con un código QR. Hoy estaba por capricho y vi que otros habían agregado códigos QR a sus blogs, y también quería hacer una prueba.
Se usa principalmente para lograr dos puntos:
1. Genere un código QR con cualquier texto.
2. Agregue una imagen en el medio del código QR.
1. Trabajo de preparación.
Prepare el paquete Core QR QR 3.0 y una imagen JPG.
Descargue el paquete de código QR QR.
Primero, tengo que descargar el paquete Zxing.jar. Estoy usando el paquete central de 3.0 aquí
Dirección de descarga: Ahora se ha trasladado a GitHub: https://github.com/zxing/zxing/wiki/getting-started-de-dovelozing,
Por supuesto, también puede descargar el paquete JAR desde el repositorio de Maven: http://central.maven.org/maven2/com/google/zxing/core/
2. Programación
1. Comience al eclipse, cree un nuevo proyecto Java y encuentre el nombre del proyecto (en este ejemplo, así que lo hágalo QRCodesoft). Haga clic en Siguiente:
2. Importa el paquete Zxing.jar. Estoy usando el paquete central de 3.0 aquí: haga clic en "Agregar jar externo (x) ...".
3. Crea dos nuevas clases, a saber:
Bufferedimageluminancesource.java
Qrcodeutil.java
Los códigos clave son: BufferedimageLuminancesource.java y Qrcodeutil.java, donde el método principal probado se encuentra en qrcodeutil.java.
BufferedImageLuminancesource.Java Código del programa:
package com.yihaomen.barcode;import java.awt.Graphics2D;import java.awt.geom.AffineTransform;import java.awt.image.BufferedImage;import com.google.zxing.LuminanceSource;public class BufferedImageLuminanceSource extends LuminanceSource {private final BufferedImage image;private final int left;private final int top;public BufferedImageLuminSeSource (Imagen de BufferedImage) {this (Image, 0, 0, Image.getWidth (), Image.Getheight ());} public BufferedImageMageLuminancesource (BufferedImage Image, int top, int width, int hight) {super (width, altura); int (Left + Width> SourceWidth || Top + Height> SourceHeight) {Throw New IlegalArgumentException ("El rectángulo de cultivo no se ajusta dentro de los datos de la imagen");} for (int y = top; y <top + tight; y ++) {for (int x = izquierda; x <izquierda + width; x ++) {if ((image.getRgbb (x, y) & 0xff00000000000000) {image.setRgb (x, y, 0xffffff); // = white}}} this.image = new BufferedImage (SourceWidth, SourceHeight, BufferedImage.Type_Byte_Gray); this.Image.getGraphics (). DrawImage (Image, 0, 0, NULL); this.left = Left; this.Top = top = top;} byte public [] getRow (int Y, byte [] > = getheight ()) {Throw New IlegalArgumentException ("La fila solicitada está fuera de la imagen:" + y);} int width = getWidth (); if (fila == null || file.length <width) {fila = nueva byte [width];} image.getraSter (). getDataelements (izquierda, superior + y, width, 1, fila, fila; getMatrix () {int width = getWidth (); int hight = getheight (); int ause = width * altura; byte [] matrix = new byte [área]; image.getRaster (). getDataelements (izquierda, top, viñh, altura, matriz); return matrix;} pública booleaneannscropsupported () {return verdadero;} int top, int width, int hight) {return new BufferedImageLuminancesource (imagen, this.left + izquierda, this.top + top, ancho, altura);} public boolean isrotatesUpported () {return true;} public luminanceseurce rotateCountereTeWise image.getheight (); affinetransform transform = new Affinetransform (0.0, -1.0, 1.0, 0.0, SourceWidth); BufferedImage RotatedImage = new BufferedImage (SourceHeight, SourceWidth, BufferedImage.Type_Byte_gray); Graphics2D G = rotedImage.CreateChics (); G.DrawImage (Image, Igumage, TRANSFOR nulo); g.dispose (); int width = getWidth (); return New BufferedImageLuminancesource (RotatedImage, Top, SourceWidth - (izquierda + ancho), getheight (), ancho);}}QRCodeUtil.Java Código del programa:
paquete com.yihaomen.barcode; import java.awt.basicStroke; import java.awt.graphics; import java.awt.graphics2d; import java.awt.image; import java.awt.shape; import java.awt.geom.roundrectangle2d; import java.awt.image.image; import; java.io.file; import java.io.outputstream; import java.util.hashtable; import java.util.random; import javax.imageio.imageio; import com.google.zxing.BarCodeFormat; import com.google.zxing.binarybitmap; import com.google.zxing.dodeodehodehiN com.google.zxing.encodeHintType; import com.google.zxing.multiformatreader; import com.google.zxing.multiformatwriter; import com.google.zxing.result; import com.google.zxing.common.bitmatrix; import com.google.zxing.common.hyridbinarizer; importador; importador; com.google.zxing.qrcode.decoder.errorcorrectionLevel;/*** Qr Code Tool Class**/public Class QrCodeutil {private static static string final charset = "utf-8"; private static final string format_name = "jpg"; // qr size private static final int qrcode_size = 300; // // // //name = "jpg"; // Qr Código Qr Private static final int Qrcode_size = 300; // // 60; // logotipo altura privada estática final inttight intimt = 60; private static bufferedImage createImage (String Content, String IMGPath, Boolean NeedCompress) lanza la excepción {Hashtable <EncodeHintType, Object> INSINTS = New Hashtable <EncodeHintType, Object> (); hints.put (encodeHintType.Error_Corrección,, CodtType, Object> (); hints.put (encodeHintType.Error_correction, ErrorCorrectionLevel.h); hints.put (encodeHintType.character_set, charset); hints.put.put (encodeHintType.margin, 1); bitMatrix bitMatrix = new MultiformAtWriter (). Encode (content, barcodeFormat.qr_code, qrcode_size, qrcode_size, hintintsize); bitmatrix.getWidth (); int hight = bitMatrix.getheight (); bufferedImage image = new BufferedImage (ancho, altura, bufferedimage.type_int_rgb); para (int x = 0; X <ancho; x ++) {for (int y = 0; y <height; y ++) {image.setrgb (x, y, bitmatrix.get (x, y)? 0xff00000000: 0xffffff);}} if (imgpath == null || "" .equals (imgpath)) {return image;} // inserta qrcodeutil.inser imgpath, necesdCompress); return image;}/** * Insertar logotipo * * @param fuente * QR Código de imagen * @param imgpath * la dirección de la imagen del logo * @param NeedCompress * si Comess * @throws Exception */private static void inserSimage (buffeDimage fuente, cadena imgpath, boolean necesar (. {width = width;} if (altura> altura) {Height = Height;} Image Image = src.getScaledInStance (Width, Height, Image.Scale_SMooth); BufferedImage Tag = New BufferedImage (Width, Height, BufferedImage.Type_Int_rgb); Graphics g = Tag.getgraphics (); G.Drawimage (Image, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0; // Dibuja el gráfico reducido g.dispose (); src = image;} // inserta logografía2d gráfico = fuente.createGraphics (); int x = (qrcode_size - width)/ 2; int y = (qrcode_size - altura)/ 2; gráfico. Roundrectangle2d.float (x, y, ancho, ancho, 6, 6); gráfico. * Si comprimir el logotipo * @throws Exception */public static void encode (string content, string imgpath, string DestPath, boolean NeedCompress) lanza la excepción {BufferedImage Image = QrCodeUtil.CreateImage (content, imgpath, NeedCompress); Mkdirs (DestPath); String = NewCon Random (). NextInt (9999999999)+". Jpg"; imageIO.Write (Image, Format_Name, nuevo archivo (DestPath+"/"+File));}/*** Cuando la carpeta no existe, Mkdir creará automáticamente directorios múltiples, que es diferente de MKDIR. (Si el directorio de los padres no existe, se lanzará una excepción) * @author Lanyuan * Correo electrónico: [email protected] * @Date 2013-12-11 10:16:36 am * @param DestPath Directory */public static void mkdirs (String string Destpath) {Archivo de archivo = archivo nuevo (nuevo archivo); // Cuando la carpeta no existe, MKDIRS creará automáticamente directorios de múltiples capas, que es diferente de MKDIR. (Mkdir lanzará una excepción si el directorio principal no existe) if (! file.exists () &&! File.isDirectory ()) {file.mkdirs ();}}/** * Generar el código QR (logo incrustado) * * @Param Content * Content * @param Imgpath * LOGO Dirección * @Param Destpath * @ThtheR de excepción de almacenamiento * encode (string content, string imgpath, string DestPath) lanza la excepción {qrcodeUdil.enCode (content, imgpath, destpath, false);}/** * Generar el código qr * * @param content * content * @param Destpath * dirección de almacenamiento * @param necesar needCompress) throws Exception {QRCodeUtil.encode(content, null, destPath, needCompress);}/** * Generate QR code* * @param content * Content* @param destPath * Storage address* @throws Exception */public static void encode(String content, String destPath) throws Exception {QRCodeUtil.encode(content, null, destPath, falso);}/** * Genere el código QR (logotipo integrado) * * @param Content * Content * @param IMGPath * LOGO DIRECCIÓN * @Param Output * Outputs. Qrcodeutil.createImage (content, imgpath, needCompress); imageIO.Write (image, format_name, output);}/** * Generar el código QR * * @param Content * Content * @Param Output * Outputs. false);}/** * Analyze QR code* * @param file * QR code image* @return * @throws Exception */public static String decode(File file) throws Exception {BufferedImage image;image = ImageIO.read(file);if (image == null) {return null;}BufferedImageLuminanceSource source = new BufferedImageLuminanceSource(image);BinaryBitmap bitmap = new BinaryBitMap (new HybridBinarizer (fuente)); resultado resultado; hashtable <decodeHintType, objeto> sugerencias = new Hashtable <DecodeHintType, objeto> (); INSTINSS.PUT (decodeHintType.Character_set, Charset); Result = new MultiformAtreader (). result.gettext (); return resultadosTR;}/** * El código QR de análisis * * @param ruta * DIRECCIÓN DE IMAGEN DE CÓDIGO QR * @return * @throws Exception */public static String decode (string ruta) lanza excepción {return qrcodeutil.decode (nuevo archivo (ruta));} public static void main (string [] args) lanza excepción {string text = "http://www.yihaomen.com"; qrcodeutil.encode (text, "c: /me.jpg", "c:/barcode", true);}}Generar código QR sin logotipo
El código del programa es el siguiente:
public static void main (string [] args) lanza la excepción {string text = "http://www.dans88.com.cn"; Qrcodeutil.enDode (texto ",", "d:/myworkdoc", true);}Ejecute este método de prueba y el código QR generado no tiene un logotipo, el estilo es el siguiente:
Si está interesado, puede escanearlo con su teléfono
Genere un código QR con un logotipo
Logotipo Puede usar su propio avatar o una imagen que desee, y usar el siguiente código, el código del programa es el siguiente:
public static void main (string [] args) lanza la excepción {string text = "http://www.dans88.com.cn"; QrcodeUtil.encode (texto, "d: /myworkdoc/my180.jpg", "d:/myworkdoc", true); }La única diferencia es que la dirección del logotipo se especifica en la base anterior, y los archivos de imagen del disco C se usan aquí.
Escanee con su teléfono móvil y puede aparecer el texto que desea aparecer. Haga clic para ingresar a su propio sitio web.
Lo anterior es usar el diseño Java para generar códigos QR. Los amigos interesados pueden referirse a él. ¡Gracias por su apoyo para este sitio!