English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Implementazione di un generatore di codici a barre QR con immagini integrate utilizzando Zxing

L'implementazione del generatore di codice a barre integrato con immagini utilizzando Zxing ha un certo valore di riferimento, come segue:

La logica di base è utilizzare prima l'immagine del codice a barre generato da Zxing, leggere l'immagine, inserire l'icona al suo interno e poi esportare l'intera immagine.

Nello progetto recente, ho bisogno di generare un codice a barre, ho trovato alcuni esempi e li ho combinati per ottenere l'effetto finale. Il codice a barre può essere generato in formato immagine (jpg ecc.) o visualizzato su una pagina web. Questo articolo è solo per la registrazione, ci sono molte somiglianze, perdonatemi......

Nota: il toolkit di Zxing richiesto, il processo generale è leggere l'immagine incorporata, trasformare il contenuto in un codice a barre, incorporare l'immagine nel codice a barre e generare l'immagine.

Ecco il codice completo:

import Java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Shape;
import java.awt.geom.AffineTransform;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.AffineTransformOp;
import 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.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
public class Zxing {
private static final int BLACK = 0xFF000000;
private static final int WHITE = 0xFFFFFFFF;
// La metà della larghezza dell'immagine 
 private static final int IMAGE_WIDTH = 80; 
 private static final int IMAGE_HEIGHT = 80; 
 private static final int IMAGE_HALF_WIDTH = IMAGE_WIDTH / 2; 
 private static final int FRAME_WIDTH = 2; 
 // Codificatore di codici a barre bidimensionali 
 private static MultiFormatWriter mutiWriter = new MultiFormatWriter(); 
public static void main(String[] args) {
try {
// BitMatrix bitMatrix = multiFormatWriter.encode(content, BarcodeFormat.QR_CODE, 400, 400, hints);
String content="13400000000";// Il contenuto del codice a barre QR
BufferedImage image = genBarcode(content, 400, 400, "F:\\amazed.png");
  if (!ImageIO.write(image, "jpg", new File("F:\\2122.jpg"))) {
   throw new IOException("Impossibile scrivere un'immagine di formato ");
  }
          /**
           // Sostituisci il codice sopra con questo, per leggere il flusso direttamente nella pagina
OutputStream os = response.getOutputStream();
 if (!ImageIO.write(image, "jpg", os)) {
       throw new IOException("Impossibile scrivere un'immagine di formato ");
      }
          **/
catch (WriterException e) {
e.printStackTrace();
} catch (IOException e) {}}
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private BufferedImage toBufferedImage(BitMatrix matrix) {
int width = matrix.getWidth();
int height = matrix.getHeight();
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
image.setRGB(x, y, matrix.get(x, y) ? BLACK : WHITE);
}
}
return image;
}
private static BufferedImage genBarcode(String content, int width, 
     int height, String srcImagePath) throws WriterException, 
     IOException { 
   // 读取源图像 
   BufferedImage scaleImage = scale(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] = scaleImage.getRGB(i, j); 
     } 
   } 
   Map<EncodeHintType, Object> hint = new HashMap<EncodeHintType, Object>(); 
   hint.put(EncodeHintType.CHARACTER_SET, "utf-8"); //内容编码
   hint.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); //错误等级
   hint.put(EncodeHintType.MARGIN, 1); //设置二维码外边框的空白区域的宽度
   // 生成二维码 
   BitMatrix matrix = mutiWriter.encode(content, BarcodeFormat.QR_CODE, 
       width, height, hint); 
   // 二维矩阵转为一维像素数组 
   int halfW = matrix.getWidth() / 2; 
   int halfH = matrix.getHeight() / 2; 
   int[] pixels = new int[width * height]; 
   for (int y = 0; y < matrix.getHeight(); y++) { 
     for (int x = 0; x < matrix.getWidth(); x++) { 
       // 读取图片 
       if (x > halfW - IMAGE_HALF_WIDTH 
           && x < halfW + IMAGE_HALF_WIDTH 
           && y > halfH - IMAGE_HALF_WIDTH 
           && y < halfH + IMAGE_HALF_WIDTH) { 
         pixels[y * width + x] = srcPixels[x - halfW 
             + IMAGE_HALF_WIDTH][y - halfH + IMAGE_HALF_WIDTH]; 
       }  
       // 在图片四周形成边框 
       else 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) 
           || (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) 
           || (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) 
           || (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)) { 
         pixels[y * width + x] = 0xfffffff; 
       } else { 
         // Ecco dove è possibile modificare il colore del codice a barre, è possibile stabilire separatamente i colori del codice a barre e dello sfondo; 
         pixels[y * width + x] = matrix.get(x, y) ? 0xff000000 
             : 0xfffffff; 
       } 
     } 
   } 
   BufferedImage image = new BufferedImage(width, height, 
       BufferedImage.TYPE_INT_RGB); 
   image.getRaster().setDataElements(0, 0, width, height, pixels); 
   return image; 
 } 
 /** 
  * Genera un'immagine icona ridimensionata in base all'altezza e alla larghezza fornite 
  * 
  * @param srcImageFile 
  *      Indirizzo del file sorgente 
  * @param height 
  *      Altezza di destinazione 
  * @param width 
  *      Larghezza di destinazione 
  * @param hasFiller 
  *      Se la proporzionalità non è corretta, è necessario riempire? true per riempire; false per non riempire; 
  * @throws IOException 
  */ 
 private static BufferedImage scale(String srcImageFile, int height, 
     int width, boolean hasFiller) throws IOException { 
   double ratio = 0.0; // Rilascio proporzionale 
   File file = new File(srcImageFile); 
   BufferedImage srcImage = ImageIO.read(file); 
   Image destImage = srcImage.getScaledInstance(width, height, 
       BufferedImage.SCALE_SMOOTH);}} 
   // Calcolo della proporzionalità 
   if ((srcImage.getHeight() > height) || (srcImage.getWidth() > width)) { 
     if (srcImage.getHeight() > srcImage.getWidth()) { 
       ratio = (new Integer(height)).doubleValue() 
           / srcImage.getHeight(); 
     } else { 
       ratio = (new Integer(width)).doubleValue() 
           / srcImage.getWidth(); 
     } 
     AffineTransformOp op = new AffineTransformOp( 
         AffineTransform.getScaleInstance(ratio, ratio), null); 
     destImage = op.filter(srcImage, null); 
   } 
   if (hasFiller) { // Completamento 
     BufferedImage image = new BufferedImage(width, height, 
         BufferedImage.TYPE_INT_RGB); 
     Graphics2D graphic = image.createGraphics(); 
     graphic.setColor(Color.PINK); 
     graphic.fillRect(10, 10, width, height); 
     graphic.drawRect(100, 360, width, height);
     if (width == destImage.getWidth(null)) { 
       graphic.drawImage(destImage, 0, 
           (height - destImage.getHeight(null)) / 2, 
           destImage.getWidth(null), destImage.getHeight(null), 
           Color.white, null); 
       Shape shape = new RoundRectangle2D.Float(0, (height - destImage.getHeight(null)) / 2, width, width, 20, 20);
       graphic.setStroke(new BasicStroke(5f));
       graphic.draw(shape);
     }
     else {}}
       graphic.drawImage(destImage, 
           (width - destImage.getWidth(null)) / 2, 0, 
           destImage.getWidth(null), destImage.getHeight(null), 
           Color.white, null);
       Shape shape = new RoundRectangle2D.Float((width - destImage.getWidth(null)) / 2, 0, width, width, 20, 20);
       graphic.setStroke(new BasicStroke(5f));
       graphic.draw(shape);
     }
     graphic.dispose(); 
     destImage = image; 
   } 
   return (BufferedImage) destImage; 
 } 
}

Questo è tutto il contenuto dell'articolo, speriamo che sia utile per il tuo studio e che tu sostenga fortemente i tutorial di urlan.

Dichiarazione: il contenuto di questo articolo è stato prelevato da Internet, è di proprietà dei rispettivi autori, il contenuto è stato contribuito e caricato autonomamente dagli utenti di Internet, questo sito non detiene i diritti di proprietà, non è stato sottoposto a editing umano e non assume responsabilità legali correlate. Se trovi contenuti sospetti di copyright, ti preghiamo di inviare una email a: notice#oldtoolbag.com (al momento dell'invio dell'email, sostituisci # con @) per segnalare, fornendo prove pertinenti. Una volta verificata, questo sito eliminerà immediatamente il contenuto sospetto di violazione del copyright.

Ti potrebbe interessare