java 生成二维码后如何给该二维码添加信息

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 生成二维码后如何给该二维码添加信息相关的知识,希望对你有一定的参考价值。

java 生成二维码后,现在已经绘制成功一张二维码图片
请通过java程序来完成以下功能
1.二维码要存储一些信息如何加到二维码中
2.扫描二维码要返回的地址怎么添加到二维码中

java可使用zxing生成二维码并为其添加信息。
以下是详细步骤:
1、创建MatrixToImageWriter类

import com.google.zxing.common.BitMatrix;   
 import javax.imageio.ImageIO;  
 import java.io.File;  
 import java.io.OutputStream;  
 import java.io.IOException;  
 import java.awt.image.BufferedImage;  
    
    
 public final class MatrixToImageWriter   
    
   private static final int BLACK = 0xFF000000;  
   private static final int WHITE = 0xFFFFFFFF;  
    
   private MatrixToImageWriter()   
    
      
   public static 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;  
     
    
      
   public static void writeToFile(BitMatrix matrix, String format, File file)  
       throws IOException   
     BufferedImage image = toBufferedImage(matrix);  
     if (!ImageIO.write(image, format, file))   
       throw new IOException("Could not write an image of format " + format + " to " + file);  
       
     
    
      
   public static void writeToStream(BitMatrix matrix, String format, OutputStream stream)  
       throws IOException   
     BufferedImage image = toBufferedImage(matrix);  
     if (!ImageIO.write(image, format, stream))   
       throw new IOException("Could not write an image of format " + format);  
       
     
    
 


2、生成二维码并添加信息

import java.io.File;  
import java.util.Hashtable;  
   
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;  
   
public class Test   
   
    /** 
     * @param args 
     * @throws Exception  
     */ 
    public static void main(String[] args) throws Exception   
        String text = "http://www.baidu.com";  
        int width = 300;  
        int height = 300;  
        //二维码的图片格式  
        String format = "gif";  
        Hashtable hints = new Hashtable();  
        //内容所使用编码  
        hints.put(EncodeHintType.CHARACTER_SET, "utf-8");  
        BitMatrix bitMatrix = new MultiFormatWriter().encode(text,  
                BarcodeFormat.QR_CODE, width, height, hints);  
        //生成二维码  
        File outputFile = new File("d:"+File.separator+"new.gif");  
        MatrixToImageWriter.writeToFile(bitMatrix, format, outputFile);  
   
      
   
参考技术A 二维码就是记录信息的,不是生成后添加的 参考技术B 二维码是记录信息的,往里面添加信息没有办法做,除非你重新生成一个二维码图片,比如你将原先的二维码信息识别出来,然后在那串信息中加上你要添加的信息,最后重新生成二维码。如果你要对现有的二维码直接修改貌似不怎么靠谱。本回答被提问者采纳 参考技术C 我刚做了这个,用google的zxing包或者qrcode包,百度一下就知道了

java 通过Qrcode生成二维码添加图片logo和文字描述

/**
 *  二维码创建
 * @author yhzm
 *
 */
public class printServiceImpl extends BaseService {
     public void barCodeGenera() {
             init(false);
             //先创建一个二维码
             String text = strRequiredParam("barcode","二维码信息");
             String desc = strRequiredParam("desc","文字内容");//二维码下面的文字描述 
             String logoPath = "d:\aa.png";//二维码的logo地址
            int logoWidth = 40; //logo的宽
            int logoHeight = 40;  //logo的高
            try{
                 Qrcode qrcode = new Qrcode();
                 qrcode.setQrcodeErrorCorrect(‘M‘);//设置纠错等级(分为:L、M、H三个等级)
                 qrcode.setQrcodeEncodeMode(‘B‘);//N代表数字、A代表a-Z、B代表其他字符
                 qrcode.setQrcodeVersion(7);//设置版本
                 
                 int width = 67+12*(7-1);//设置二维码的宽  二维码像素的大小和版本号有关  但是版本号越大   二维码也越是复杂  这个需要注意
                 int height = 67+12*(7-1);//设置二维码的高
                 //将内容变为特定UTF-8格式编码的字节码
                 byte [] qrData = text.getBytes("UTF-8");
                 
                 BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
                 //创造画笔
                 Graphics2D gs = bufferedImage.createGraphics();
                 gs.setBackground(Color.WHITE);//设置背景
                 gs.setColor(Color.BLACK);//设置画笔颜色
                 gs.clearRect(0, 0, width, height);//清除画板内容
                 //设置偏移量
                 int pixoff = 2;
                 boolean [][] d = qrcode.calQrcode(qrData);
                 for(int y=0;y<d.length;y++) {
                     for(int x=0;x<d.length;x++) {
                         if(d[x][y]) {
                             gs.fillRect(x*3+pixoff, y*3+pixoff, 3, 3);
                         }
                     }
                 }
                 gs.dispose();
                BufferedImage bm = bufferedImage;//二维码  
                File logoFile = new File(logoPath); //logo图片   
                BufferedImage logoImg = ImageIO.read(logoFile);  
                /* float ratio = 0.5;   //倒圆角
                 if(ratio>0){  
                     logoWidth = logoWidth>width*ratio ? (int)(width*ratio) : logoWidth;  
                     logoHeight = logoHeight>height*ratio ? (int)(height*ratio) : logoHeight;  
                 }  */
                int x = (width-logoWidth)/2;  
                int y = (height-logoHeight)/2;  
                Graphics g = bm.getGraphics();  
                g.drawImage(logoImg, x, y, logoWidth, logoHeight, null);  
                int whiteWidth = 0;  //白边
                Font font = new Font("黑体", Font.BOLD, 12);  
                int fontHeight = g.getFontMetrics(font).getHeight();//得到字体的高度  
                //计算需要多少行  
                int lineNum = 1;  
                int currentLineLen = 0;  
                for(int i=0;i<desc.length();i++){  
                    char c = desc.charAt(i);  
                    int charWidth = g.getFontMetrics(font).charWidth(c); 
                    //循环文字得到文字区域的行数
                    if(currentLineLen+charWidth>width){  
                        lineNum++;  
                        currentLineLen = 0;  
                        continue;  
                    }  
                    currentLineLen += charWidth;  
                }  
                int totalFontHeight = fontHeight*lineNum; //得到文字区域的高度 
                int wordTopMargin = 4;  
                BufferedImage bm1 = new BufferedImage(width, height+totalFontHeight+wordTopMargin-whiteWidth, BufferedImage.TYPE_INT_RGB); //创建将文字高度计算到其中的图片 
                Graphics g1 = bm1.getGraphics();   
                g1.setColor(Color.WHITE);  
                g1.fillRect(0, height, width, totalFontHeight+wordTopMargin-whiteWidth); //将文字部分的背景填充成白色 
                g1.setColor(Color.black);  
                g1.setFont(font);  
                g1.drawImage(bm, 0, 0, null); //将创建好的二维码从起点(0,0)开始画在图中 
                int currentLineIndex = 0;  
                //判断是否只有一行,只有一行就居中显示
                currentLineLen = lineNum-1==currentLineIndex?(width-g.getFontMetrics(font).stringWidth(desc))/2:0;
                int baseLo = g1.getFontMetrics().getAscent();  
                for(int i=0;i<desc.length();i++){  
                    String c = desc.substring(i, i+1);  
                    int charWidth = g.getFontMetrics(font).stringWidth(c); 
                    //判断是否需要换行
                    if(currentLineLen+charWidth>width){  
                        currentLineIndex++;  
                        //判断是否是最后一行  最后一行居中显示
                        currentLineLen = lineNum-1==currentLineIndex?(width-g.getFontMetrics(font).stringWidth(desc.substring(i)))/2:0;
                        g1.drawString(c, currentLineLen + whiteWidth, height+baseLo+fontHeight*(currentLineIndex)+wordTopMargin);//将单个文字画到对应位置 
                        currentLineLen = charWidth;  
                        continue;  
                    }  
                    g1.drawString(c, currentLineLen+whiteWidth, height+baseLo+fontHeight*(currentLineIndex) + wordTopMargin);  
                    currentLineLen += charWidth;  
                } 
                g1.dispose();  
                bm = bm1;
             response.setContentType("image/jpeg");
             //好了 ,现在通过IO流来传送数据
            ImageIO.write(bm , "JPEG", response.getOutputStream());
        }catch(Throwable e){  
            e.printStackTrace();  
        }  
    }
}

这个可以用来生成二维码,并且携带log和文字。

以上是关于java 生成二维码后如何给该二维码添加信息的主要内容,如果未能解决你的问题,请参考以下文章

二维码生成器加logo怎么制作

java 通过Qrcode生成二维码添加图片logo和文字描述

Java生成二维码

微信二维码添加logo

文字如何生成二维码?

扫二维码后能显示商品信息那种二维码怎么做?