• java编写二维码


    //自动生成二维码接口two_dimension_code
    String text = "http://10.20.24.43:8080/meeting/meeting_register_phoneIndex.html"; //二维码生产内容--跳转url
    int width = 350; // 二维码图片的宽
    int height = 350; // 二维码图片的高
    String outPutPath = path+ "\"+activity_name+"二维码"+".png"; //二维码生成保存路径
    String imageType = "png"; //二维码生成类型
    QRCodeTool.zxingCodeCreate(text, width, height, outPutPath, imageType);   //调用工具类

    //*****************以下是工具类*************/

    package com.yd.meeting.register.util;

    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.io.UnsupportedEncodingException;
    import java.util.HashMap;
    import java.util.Map;

    import javax.imageio.ImageIO;

    import org.apache.commons.logging.Log;
    import org.apache.commons.logging.LogFactory;

    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 QRCodeTool {
    private static final Log log = LogFactory.getLog(QRCodeTool.class);
    private static final int IMAGE_WIDTH = 100;
    private static final int IMAGE_HEIGHT = 100;
    private static final int IMAGE_HALF_WIDTH = IMAGE_WIDTH / 2;
    private static final int FRAME_WIDTH = 2;
    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) {
    log.debug(e);
    } catch (WriterException e) {
    log.debug(e);
    }
    }

    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 > 0 && x < 170 && y > 0 && y < 170) {
    Color color = new Color(231, 144, 56);
    int colorInt = color.getRGB();
    pixels[y * width + x] = matrix.get(x, y) ? colorInt
    : 16777215;
    }
    // 读取图片
    else 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 > halfW - 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 {
    // 二维码颜色
    int num1 = (int) (50 - (50.0 - 13.0) / matrix.getHeight()
    * (y + 1));
    int num2 = (int) (165 - (165.0 - 72.0) / matrix.getHeight()
    * (y + 1));
    int num3 = (int) (162 - (162.0 - 107.0)
    / matrix.getHeight() * (y + 1));
    Color color = new Color(num1, num2, num3);
    int colorInt = color.getRGB();
    // 此处可以修改二维码的颜色,可以分别制定二维码和背景的颜色;
    pixels[y * width + x] = matrix.get(x, y) ? colorInt
    : 16777215;
    // 0x000000:0xffffff
    }
    }
    }
    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;
    }
    //////////////////////////
    //二维码颜色
    private static final int BLACK = 0xFF000000;
    //二维码颜色
    private static final int WHITE = 0xFFFFFFFF;

    /**
    * <span style="font-size:18px;font-weight:blod;">ZXing 方式生成二维码</span>
    * @param text <a href="javascript:void();">二维码内容</a>
    * @param width 二维码宽
    * @param height 二维码高
    * @param outPutPath 二维码生成保存路径
    * @param imageType 二维码生成格式
    */
    public static void zxingCodeCreate(String text, int width, int height, String outPutPath, String imageType){
    Map<EncodeHintType, String> his = new HashMap<EncodeHintType, String>();
    //设置编码字符集
    his.put(EncodeHintType.CHARACTER_SET, "utf-8");
    try {
    //1、生成二维码
    BitMatrix encode = new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE, width, height, his);

    //2、获取二维码宽高
    BitMatrix deleteWhite = deleteWhite(encode);
    int codeWidth = deleteWhite.getWidth();
    int codeHeight = deleteWhite.getHeight();
    //3、将二维码放入缓冲流
    BufferedImage image = new BufferedImage(codeWidth, codeHeight, BufferedImage.TYPE_INT_RGB);
    for (int i = 0; i < codeWidth; i++) {
    for (int j = 0; j < codeHeight; j++) {
    //4、循环将二维码内容定入图片
    image.setRGB(i, j, deleteWhite.get(i, j) ? BLACK : WHITE);
    }
    }
    File outPutImage = new File(outPutPath);
    //如果图片不存在创建图片
    if(!outPutImage.exists())
    outPutImage.createNewFile();
    //5、将二维码写入图片
    ImageIO.write(image, imageType, outPutImage);
    } catch (WriterException e) {
    e.printStackTrace();
    System.out.println("二维码生成失败");
    } catch (IOException e) {
    e.printStackTrace();
    System.out.println("生成二维码图片失败");
    }
    }

    public static BitMatrix deleteWhite(BitMatrix matrix){
    int[] rec = matrix.getEnclosingRectangle();
    int resWidth = rec[2] + 1;
    int resHeight = rec[3] + 1;


    BitMatrix resMatrix = new BitMatrix(resWidth, resHeight);
    resMatrix.clear();
    for (int i = 0; i < resWidth; i++) {
    for (int j = 0; j < resHeight; j++) {
    if (matrix.get(i + rec[0], j + rec[1]))
    resMatrix.set(i, j);
    }
    }
    return resMatrix;
    }
    public static void main(String[] args) throws UnsupportedEncodingException {
    // 依次为内容(不支持中文),宽,长,中间图标路径,储存路径
    //C:UsersAdministratorDesktop网点ERP
    /*DEMO2.encode("http://www.baidu.com/", 512, 512,
    "D:\logo.png", "D:\2013-01.jpg");*/
    /* QRCodeTool.encode("http://www.baidu.com/", 512, 512,
    "C:\Users\Administrator\Desktop\0.png", "D:\2013-02.jpg");*/
    /* QRCodeTool.encode("http://210.45.175.11/", 512, 512,
    "F:\杂图\593219843225a0c8a1e93c25b.jpg", "D:\2013-01.jpg");*/
    QRCodeTool.zxingCodeCreate("http://weixin.yundasys.com/opserver/interface/ydwechat/sharePage.do?viewKey=V007_1&data=1013201700", 350, 350, "d://zxingcode.jpg", "jpg");

    }
    }

  • 相关阅读:
    绿色版 notepad++ 添加鼠标右键菜单
    Scala 安装与配置
    Scala 神奇的下划线 _
    Kafka 安装部署
    Pulsar 下一代消息平台
    Sqoop 安装部署
    Flume 常用配置项
    Android-selector
    android- 9patch
    有关内存的思考题
  • 原文地址:https://www.cnblogs.com/Darkqueen/p/10310402.html
Copyright © 2020-2023  润新知