java生成二维码

package com.pbw.T;
 
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.geom.AffineTransform;
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 Test {
 
// 图片宽度的一般  
    private static final int IMAGE_WIDTH = 20;  
    private static final int IMAGE_HEIGHT = 20;  
    private static final int IMAGE_HALF_WIDTH = IMAGE_WIDTH / 2;  
    private static final int FRAME_WIDTH = 1;  
 
    // 二维码写码器  
    private static MultiFormatWriter mutiWriter = new MultiFormatWriter();  
    
    public static void encode(String content, int width, int height,  
            String srcImagePath, String destImagePath) {  
       try {  
           ImageIO.write(genBarcode(content, width, height, srcImagePath),  
                   "jpg", new File(destImagePath));  
       } catch (IOException e) {  
           e.printStackTrace();  
       } catch (WriterException e) {  
           e.printStackTrace();  
       }  
    }  
   
    
    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);  
       // 生成二维码  
      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 {  
                   // 此处可以修改二维码的颜色,可以分别制定二维码和背景的颜色;  
                  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;  
   }  
 
    private static BufferedImage scale(String srcImageFile, int height,  
            int width, boolean hasFiller) throws IOException {  
       double ratio = 0.0; // 缩放比例  
       File file = new File(srcImageFile);  
       BufferedImage srcImage = ImageIO.read(file);  
       Image destImage = srcImage.getScaledInstance(width, height,  
                BufferedImage.SCALE_SMOOTH);  
       // 计算比例  
        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) {// 补白  
           BufferedImage image = new BufferedImage(width, height,  
                   BufferedImage.TYPE_INT_RGB);  
          Graphics2D graphic = image.createGraphics();  
           graphic.setColor(Color.white);  
            graphic.fillRect(0, 0, 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);  
           else  
              graphic.drawImage(destImage,  
                     (width - destImage.getWidth(null)) / 2, 0,  
                       destImage.getWidth(null), destImage.getHeight(null),  
                        Color.white, null);  
           graphic.dispose();  
            destImage = image;  
       }  
       return (BufferedImage) destImage;  
   }  
    
    
    
public static void main(String[] args) {
 
 
Test  
        .encode("I love you!",  
                100, 100, "d:\\qq.jpg", "E:\\20160226.jpg");  
}
 
}
 
 

 

jar包附件里边可下载。
 

你可以使用 `zxing` 库来生成二维码。下面是一个示例代码: ```java 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 QRCodeGenerator { public static void main(String[] args) { String text = "Hello, World!"; // 二维码中的文本内容 int width = 300; // 二维码图片的宽度 int height = 300; // 二维码图片的高度 String format = "png"; // 二维码图片的格式 // 设置二维码的参数 Map<EncodeHintType, Object> hints = new HashMap<>(); hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); // 设置字符集编码为UTF-8 hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); // 设置错误校验级别为高 try { BitMatrix bitMatrix = new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE, width, height, hints); // 生成二维码图片的路径 File outputFile = new File("qrcode.png"); // 将 bitMatrix 转换为 BufferedImage 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, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF); } } // 将 BufferedImage 写入到文件中 ImageIO.write(image, format, outputFile); System.out.println("二维码生成成功!"); } catch (WriterException | IOException e) { e.printStackTrace(); } } } ``` 在上面的代码中,你可以修改 `text` 变量来设定二维码中的文本内容,`width` 和 `height` 变量来设定生成的二维码图片的尺寸,`format` 变量来设定生成的二维码图片的格式。最后,运行代码,会在当前目录下生成一个名为 "qrcode.png" 的二维码图片。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值