zoukankan      html  css  js  c++  java
  • java生成二维码

    1.引入maven坐标

            <!--二维码生成-->
            <dependency>
                <groupId>com.google.zxing</groupId>
                <artifactId>core</artifactId>
                <version>${zxing-version}</version>
            </dependency>
            <dependency>
                <groupId>com.google.zxing</groupId>
                <artifactId>javase</artifactId>
                <version>${zxing-version}</version>
            </dependency>

    2.编写工具类

    import java.awt.*;
    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.InputStream;
    import java.util.Hashtable;
    
    import javax.imageio.ImageIO;
    
    import com.deaon.common.util.keygen.IdGeneratorUtil;
    import com.google.zxing.*;
    import com.google.zxing.common.BitMatrix;
    import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
    
    public class QRCodeUtils {
        private static final String CHARSET = "utf-8";
        // 图片宽度的一半
        private static final int IMAGE_WIDTH = 40;
        private static final int IMAGE_HEIGHT = 40;
        private static final int IMAGE_HALF_WIDTH = IMAGE_WIDTH / 2;
        private static final int FRAME_WIDTH = 2;
        // 二维码尺寸
        private static final int QRCODE_SIZE = 300;
        // 二维码写码器
        private static MultiFormatWriter mutiWriter = new MultiFormatWriter();
    
        public static String encode(String content,
                                    InputStream srcImagePath, String destImagePath) throws WriterException {
            Hashtable<EncodeHintType, Object> hints = new Hashtable<>();
            hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
            hints.put(EncodeHintType.CHARACTER_SET, CHARSET);
            hints.put(EncodeHintType.MARGIN, 1);
            BitMatrix bitMatrix = new MultiFormatWriter().encode(content,
                    BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE, hints);
            int width = bitMatrix.getWidth();
            int height = bitMatrix.getHeight();
            try {
                String file = IdGeneratorUtil.createId() +".jpg";
                //生成图片文件
                ImageIO.write(genBarcode(content, width, height, srcImagePath),
                        "jpg", new File(destImagePath+"/"+file));
                return file;
            } catch (IOException e) {
                e.printStackTrace();
            } catch (WriterException e) {
                e.printStackTrace();
            }
            return null;
        }
    
        private static BufferedImage genBarcode(String content, int width,
                                                int height, InputStream srcImagePath) throws WriterException,
                IOException, WriterException {
            // 读取源图像
            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);//图片的像素点
                }
            }
            //编码
            Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();
            hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
            // 生成二维码
            BitMatrix matrix = mutiWriter.encode(content, BarcodeFormat.QR_CODE,
                    width, height, hints);
    
            // 二维矩阵转为一维像素数组
            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 < 100 && y > 0 && y < 100) {
                        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 > 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 {
                        // 二维码颜色(RGB)
                        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;
        }
        /**
         * 把传入的原始图像按高度和宽度进行缩放,生成符合要求的图标
         *
         * @param srcImageFile
         *            源文件地址
         * @param height
         *            目标高度
         * @param width
         *            目标宽度
         * @param hasFiller
         *            比例不对时是否需要补白:true为补白; false为不补白;
         * @throws IOException
         */
        private static BufferedImage scale(InputStream srcImageFile, int height,
                                           int width, boolean hasFiller) throws IOException {
            double ratio = 0.0; // 缩放比例
            //File file = srcImageFile;
            BufferedImage srcImage = ImageIO.read(srcImageFile);
            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) throws Exception {
           /* InputStream url = getClass().getClassLoader().getResourceAsStream("logo/logo.png");
            //本地生成二维码图片
            String file = QRCodeUtils.encode(newsLink + "?origin=1&user=" + encryptHex, url,destPath);*/
    
        }
    }
  • 相关阅读:
    171. Excel Sheet Column Number (Easy)
    349. Intersection of Two Arrays (Easy)
    453. Minimum Moves to Equal Array Elements (Easy)
    657. Judge Route Circle (Easy)
    CSS笔记
    保存页面状态
    UI开发总结
    ubuntu 下配置munin
    反向代理配置
    JavaScript 高级程序设计第二版
  • 原文地址:https://www.cnblogs.com/huqi96/p/14214549.html
Copyright © 2011-2022 走看看