El uso de ZXing para implementar imágenes integradas de generadores de código QR tiene cierto valor de referencia, de la siguiente manera:
La idea básica es usar primero la imagen del código QR generada por Zxing, luego leer la imagen, insertar el icono en él y luego emitir toda la imagen.
En proyectos recientes, necesitamos generar códigos QR. Después de encontrar algunos ejemplos, hemos logrado el efecto final. El código QR puede generar formato de imagen (JPG, etc.) o mostrarse en la página web. Este artículo solo se registra, y hay muchas similitudes, por lo que me gustaría olvidarlo. . . .
Nota: Para las herramientas que requieren empaquetado ZXing, el proceso general es leer imágenes integradas, convertir el contenido en código QR, incrustar las imágenes en código QR y producir imágenes.
Aquí está el código completo:
import java.awt.basicStroke; import java.awt.color; import java.awt.graphics2d; import java.awt.image; imaga java.awt.shape; import java.awt.geom.affinetransform; import java.awt.geom.roundrectangle2d; importar java.awt.awt.AffafafafiAf java.awt.image.bufferedImage; import java.io.file; import java.io.ioException; import java.util.hashmap; import java.util.map; import javax.Imageio.Imageio; import Com.Google.zxing.BarcodeFormat; import Com.Google.zxing.encodehodype; com.google.zxing.multiformatwriter; import com.google.zxing.writerException; import com.google.zxing.common.bitmatrix; import com.google.zxing.qrcode.decoder.errorcorrectionLelvel; public class zxing {private estatic int negry = 0xff000000; privado static final int white = 0xfff; static final int image_width = 80; Private static final int Image_half_width = image_width / 2; Private static final int frame_width = 2; // Código QR Escribir MultiformAtwriter estático privado MutiWriter = new MultiformAtWriter (); public static void main (string [] args) {try {// bitMatrix bitMatrix = multiformatwriter.enCode (content, barcodeFormat.qr_code, 400, 400, sugerencias); string content = "1340000000000"; // Qr Code Content BufferedImage Image = GenBarCode (Content, 400, 400, "F: //amazed. if (! imageio.write (imagen, "jpg", nuevo archivo ("f: //2122.jpg"))) {throle new ioException ("no pudo escribir una imagen de formato"); } /** // intercambia el código anterior aquí y usa la transmisión para leerlo en la página OutputStream OS = Response.getOutputStream (); if (! ImageIO.Write (Image, "JPG", OS)) {Throw New IoException ("No se pudo escribir una imagen de formato"); } **/} Catch (WriteRexception e) {E.PrintStackTrace ();} Catch (ioException e) {// TODO Generado automático Blocke.PrintStackTRace ();}} Private BufferedImage TobufferDimage (BitMatrix matric) {int matrix.getheight (); bufferedImage image = new BufferedImage (width, altura, bufferedImage.type_int_rgb); for (int x = 0; x <width; x ++) {for (int y = 0; y <height; y ++) {image.setRgbb (x, y, matrix.get (x, y)? Black: white;} BufferedImage GenBarCode (Contenido de cadena, Inthth, Int Height, String srcImagePath) arroja WriteRexception, ioException {// lee la imagen de la fuente de bufferedImage de buffedimage = escala (srcImagePath, image_width, image_height, true); int [] [] srcpixels = new int [image_width] [image_height]; for (int i = 0; i <scaleImage.getWidth (); i ++) {for (int j = 0; j <scaleImage.getheight (); j ++) {srcpixels [i] [j] = escalaMage.getRgb (i, j); }} Map <codeDeDintType, object> tint = new HashMap <codeDeDintType, object> (); hint.put (encodeHintType.character_set, "UTF-8"); // Contenido Codificación de sugerencias. // Establezca el ancho del área en blanco del borde exterior del código QR // Generar el código QR BitMatrix Matrix = MutiWriter.Encode (Content, BarcodeFormat.qr_code, ancho, altura, sugerir); // Convierta la matriz 2D en una matriz de píxeles unidimensional int Halkw = matrix.getWidth () / 2; int halfh = matrix.getheight () / 2; int [] píxeles = new int [width * altura]; for (int y = 0; y <matrix.getheErte (); y ++) {for (int x = 0; x <matrix.getWidth (); x ++) {// leer la imagen if (x> halfw - image_half_width && x <mediocHw+image_half_width & & y> mediohh - image_half_hidth && y <y media Image_half_width) {píxeles [y * ancho + x] = srcpixels [x - halfw + image_half_width] [y - halfh + image_half_width]; } // forme un borde alrededor de la imagen más if (((x> halfw - image_half_width - frame_width && x <halfw - image_half_width + frame_width && y> halfh - image_half_width - frame_width && y <halfh + image_half_width + frame_width) - frame_width && x <halfw + image_half_width + frame_width && y> halfh - image_half_width - frame_width && y <halfh + image_half_width + frame_width) || && y> halfh - image_half_width - frame_width && y <halfh - image_half_width + frame_width) || + Image_half_width + frame_width)) {píxeles [y * ancho + x] = 0xffffffff; } else {// Aquí puede modificar el color del código QR, y puede formular los colores del código QR y el fondo respectivamente; píxeles [y * ancho + x] = matrix.get (x, y)? 0xff000000: 0xffffffff; }}} BufferedImage Image = new BufferedImage (ancho, altura, bufferedimage.type_int_rgb); image.getRaster (). setDataelements (0, 0, ancho, altura, píxeles); imagen de retorno; } /** * Escala la imagen original pasada por altura y ancho para generar un icono que cumpla con los requisitos * * @param srcImageFile * Dirección del archivo de origen * @param altura * altura de destino * @param ancho * ancho de destino * @param Hasfiller * es necesario para completar cuando la escala es incorrecta: la verdadera se llena; Los falsos no se llenan; * @throws ioException */ escala de bufferedimage estática privada (cadena srcImageFile, int altura, int width, boolean Hasfiller) lanza ioexception {doble relación = 0.0; // escala archivo archivo = nuevo archivo (srcImageFile); BufferedImage srcImage = imageIO.read (archivo); Image Destimage = srcimage.getScaledInstance (ancho, altura, bufferedimage.scale_smooth); // Calcule la escala if ((srcimage.getheight ()> altura) || (srcImage.getWidth ()> width)) {if (srcImage.getheight ()> srcImage.getWidth ()) {ratio = (nuevo entero). } else {ratio = (nuevo entero (ancho)). DoubleValue () / srcimage.getWidth (); } Affinetransformop op = new Affinetransformop (affinetransform.getScaleInstance (relación, relación), nulo); Destimage = op.filter (srcimage, nulo); } if (Hasfiller) {// rellenar la imagen de BufferedImage = new BufferedImage (ancho, altura, bufferedimage.type_int_rgb); Graphics2d Graphic = Image.CreateGraphics (); Graphic.SetColor (color.pink); Graphic.fillrect (10, 10, ancho, altura); Graphic.Drawrect (100, 360, ancho, altura); if (width == Destimage.getWidth (NULL)) {Graphic.DrawImage (Destimage, 0, (altura - Destimage.Getheight (NULL)) / 2, Destimage.getWidth (NULL), Destimage.Getheight (NULL), Color.White, Null); Forma forma = nuevo Roundrectangle2d.float (0, (altura - Destimage.getheight (nulo)) / 2, ancho, ancho, 20, 20); Graphic.SetStroke (nuevo BasicsTroke (5F)); Graphic.Draw (forma); } else {Graphic.DrawImage (Destimage, (ancho - Destimage.getWidth (NULL)) / 2, 0, Destimage.getWidth (NULL), Destimage.Getheight (NULL), Color.White, NULL); Forma forma = nuevo Roundrectangle2d.float ((ancho - Destimage.getWidth (nulo)) / 2, 0, ancho, ancho, 20, 20); Graphic.SetStroke (nuevo BasicsTroke (5F)); Graphic.Draw (forma); } Graphic.Dispose (); Destimage = imagen; } return (BufferedImage) Destimage; }}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.