zoukankan      html  css  js  c++  java
  • 二维码生成,二维码中嵌套图片,文字生成图片

    package com.fh.util;

    import java.awt.BasicStroke;
    import java.awt.Color;
    import java.awt.Graphics2D;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;

    import javax.imageio.ImageIO;

    import jp.sourceforge.qrcode.QRCodeDecoder;
    import jp.sourceforge.qrcode.exception.DecodingFailedException;

    import com.swetake.util.Qrcode;

    /**
     * 二维码 创建人:FH 313596790QQ 创建时间:2015年4月10日
     *
     * @version
     */
    public class TwoDimensionCode {

        /**
         * 生成二维码(QRCode)图片
         *
         * @param content
         *            存储内容
         * @param imgPath
         *            图片路径
         */
        public static void encoderQRCode(String content, String imgPath) {
            encoderQRCode(content, imgPath, "png", 2);
        }

        /**
         * 生成二维码(QRCode)图片
         *
         * @param content
         *            存储内容
         * @param output
         *            输出流
         */
        public static void encoderQRCode(String content, OutputStream output) {
            encoderQRCode(content, output, "png", 2);
        }

        /**
         * 生成二维码(QRCode)图片
         *
         * @param content
         *            存储内容
         * @param imgPath
         *            图片路径
         * @param imgType
         *            图片类型
         */
        public static void encoderQRCode(String content, String imgPath,
                String imgType) {
            encoderQRCode(content, imgPath, imgType, 2);
        }

        /**
         * 生成二维码(QRCode)图片
         *
         * @param content
         *            存储内容
         * @param output
         *            输出流
         * @param imgType
         *            图片类型
         */
        public static void encoderQRCode(String content, OutputStream output,
                String imgType) {
            encoderQRCode(content, output, imgType, 2);
        }

        /**
         * 生成二维码(QRCode)图片
         *
         * @param content
         *            存储内容
         * @param imgPath
         *            图片路径
         * @param imgType
         *            图片类型
         * @param size
         *            二维码尺寸
         */
        public static void encoderQRCode(String content, String imgPath,
                String imgType, int size) {
            try {
                BufferedImage bufImg = qRCodeCommon(content, imgType, size);

                File imgFile = new File(imgPath);
                // 生成二维码QRCode图片
                ImageIO.write(bufImg, imgType, imgFile);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        /**
         * 生成二维码(QRCode)图片
         *
         * @param content
         *            存储内容
         * @param output
         *            输出流
         * @param imgType
         *            图片类型
         * @param size
         *            二维码尺寸
         */
        public static void encoderQRCode(String content, OutputStream output,
                String imgType, int size) {
            try {
                BufferedImage bufImg = qRCodeCommon(content, imgType, size);
                // 生成二维码QRCode图片
                ImageIO.write(bufImg, imgType, output);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        /**
         * 生成二维码(QRCode)图片的公共方法
         *
         * @param content
         *            存储内容
         * @param imgType
         *            图片类型
         * @param size
         *            二维码尺寸
         * @return
         */
        private static BufferedImage qRCodeCommon(String content, String imgType,
                int size) {
            BufferedImage bufImg = null;
            size = 10;
            try {
                Qrcode qrcodeHandler = new Qrcode();
                // 设置二维码排错率,可选L(7%)、M(15%)、Q(25%)、H(30%),排错率越高可存储的信息越少,但对二维码清晰度的要求越小
                qrcodeHandler.setQrcodeErrorCorrect('M');
                qrcodeHandler.setQrcodeEncodeMode('B');
                // 设置设置二维码尺寸,取值范围1-40,值越大尺寸越大,可存储的信息越大
                qrcodeHandler.setQrcodeVersion(size);
                // 获得内容的字节数组,设置编码格式
                byte[] contentBytes = content.getBytes("utf-8");
                // 图片尺寸
                // int imgSize = 67 + 12 * (size - 1);
                int imgSize = 67 + 12 * (size - 1);

                // System.out.println(imgSize);

                bufImg = new BufferedImage(imgSize, imgSize,
                        BufferedImage.TYPE_INT_RGB);
                Graphics2D gs = bufImg.createGraphics();
                // 设置背景颜色
                gs.setBackground(Color.WHITE);
                gs.clearRect(0, 0, imgSize, imgSize);

                // 设定图像颜色> BLACK
                gs.setColor(Color.BLACK);
                // 设置偏移量,不设置可能导致解析出错
                int pixoff = 2;
                // 输出内容> 二维码
                if (contentBytes.length > 0 && contentBytes.length < 800) {

                    boolean[][] codeOut = qrcodeHandler.calQrcode(contentBytes);
                    for (int i = 0; i < codeOut.length; i++) {
                        for (int j = 0; j < codeOut.length; j++) {
                            if (codeOut[j][i]) {
                                gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3);
                            }
                        }
                    }
                } else {
                    throw new Exception("QRCode content bytes length = "
                            + contentBytes.length + " not in [0, 800].");
                }
                gs.dispose();
                bufImg.flush();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return bufImg;
        }

        /**
         * 解析二维码(QRCode)
         *
         * @param imgPath
         *            图片路径
         * @return
         */
        public static String decoderQRCode(String imgPath) throws Exception {
            // QRCode 二维码图片的文件
            File imageFile = new File(imgPath);
            BufferedImage bufImg = null;
            String content = null;
            try {
                bufImg = ImageIO.read(imageFile);
                QRCodeDecoder decoder = new QRCodeDecoder();
                content = new String(decoder.decode(new TwoDimensionCodeImage(
                        bufImg)), "utf-8");
            } catch (IOException e) {
                // System.out.println("Error: " + e.getMessage());
                // e.printStackTrace();
            } catch (DecodingFailedException dfe) {
                // System.out.println("Error: " + dfe.getMessage());
                // dfe.printStackTrace();
            }
            return content;
        }

        /**
         * 解析二维码(QRCode)
         *
         * @param input
         *            输入流
         * @return
         */
        public static String decoderQRCode(InputStream input) {
            BufferedImage bufImg = null;
            String content = null;
            try {
                bufImg = ImageIO.read(input);
                QRCodeDecoder decoder = new QRCodeDecoder();
                content = new String(decoder.decode(new TwoDimensionCodeImage(
                        bufImg)), "utf-8");
            } catch (IOException e) {
                System.out.println("Error: " + e.getMessage());
                e.printStackTrace();
            } catch (DecodingFailedException dfe) {
                System.out.println("Error: " + dfe.getMessage());
                dfe.printStackTrace();
            }
            return content;
        }


        /**
         * 二维码绘制logo
         *
         * @param twodimensioncodeImg
         *            二维码图片文件
         * @param logoImg
         *            logo图片文件
         * @throws IOException
         * */
        public static BufferedImage encodeImgLogo(File twodimensioncodeImg,
                File logoImg) throws IOException {
            BufferedImage twodimensioncode = null;

            try {
                if (!twodimensioncodeImg.isFile() || !logoImg.isFile()) {
                    System.out.println("输入非图片");
                    return null;
                }
                // 读取二维码图片
                twodimensioncode = ImageIO.read(twodimensioncodeImg);
                // 获取画笔
                Graphics2D g = twodimensioncode.createGraphics();
                // 读取logo图片
                BufferedImage logo = ImageIO.read(logoImg);
                // 设置二维码大小,太大,会覆盖二维码,此处20%
                int logoWidth = logo.getWidth(null) > twodimensioncode.getWidth() * 2 / 10 ? (twodimensioncode
                        .getWidth() * 2 / 10) : logo.getWidth(null);
                int logoHeight = logo.getHeight(null) > twodimensioncode
                        .getHeight() * 2 / 10 ? (twodimensioncode.getHeight() * 2 / 10)
                        : logo.getHeight(null);
                // 设置logo图片放置位置
                // 中心
                int x = (twodimensioncode.getWidth() - logoWidth) / 2;
                int y = (twodimensioncode.getHeight() - logoHeight) / 2;
                // 右下角,15为调整值
                // int x = twodimensioncode.getWidth() - logoWidth-15;
                // int y = twodimensioncode.getHeight() - logoHeight-15;
                // 开始合并绘制图片
                g.drawImage(logo, x, y, logoWidth, logoHeight, null);
                g.drawRoundRect(x, y, logoWidth, logoHeight, 15, 15);
                // logo边框大小
                g.setStroke(new BasicStroke(2));
                // logo边框颜色
                g.setColor(Color.WHITE);
                g.drawRect(x, y, logoWidth, logoHeight);
                g.dispose();
                logo.flush();
                twodimensioncode.flush();
            } catch (Exception e) {
                System.out.println("二维码绘制logo失败");
            }
            ImageIO.write(twodimensioncode, "png", twodimensioncodeImg);// 输出png图片
            return twodimensioncode;
        }

        /**
         * 二维码输出到文件
         *
         * @param twodimensioncodeImg
         *            二维码图片文件
         * @param logoImg
         *            logo图片文件
         * @param format
         *            图片格式
         * @param file
         *            输出文件
         * @throws IOException
         * */
        public static void writeToFile(File twodimensioncodeImg, File logoImg,
                String format, File file) throws IOException {
            BufferedImage image = encodeImgLogo(twodimensioncodeImg, logoImg);
            try {
                ImageIO.write(image, format, file);
            } catch (IOException e) {
                System.out.println("二维码写入文件失败" + e.getMessage());
            }
        }

        /**
         * 二维码流式输出
         *
         * @param twodimensioncodeImg
         *            二维码图片文件
         * @param logoImg
         *            logo图片文件
         * @param format
         *            图片格式
         * @param stream
         *            输出流
         * @throws IOException
         * */
        public static void writeToStream(File twodimensioncodeImg, File logoImg,
                String format, OutputStream stream) throws IOException {
            BufferedImage image = encodeImgLogo(twodimensioncodeImg, logoImg);
            try {
                ImageIO.write(image, format, stream);
            } catch (IOException e) {
                System.out.println("二维码写入流失败" + e.getMessage());
            }
        }

        public static void main(String[] args) {
           //在这测试
        }
    }

    package com.fh.util;

    import java.awt.Color;
    import java.awt.Font;
    import java.awt.FontMetrics;
    import java.awt.Graphics;
    import java.awt.Rectangle;
    import java.awt.image.BufferedImage;
    import java.io.File;

    import javax.imageio.ImageIO;

    public class FontImage {
        public static void main(String[] args) throws Exception {
            createImage("102桌", new Font("宋体", Font.BOLD, 14), new File("g:/a.png"));
            createImage("102桌", new Font("黑体", Font.BOLD, 14),new File("g:/a1.png"));
            createImage("102桌", new Font("黑体", Font.PLAIN, 14), new File("g:/a2.png"));
        }

        // 根据str,font的样式以及输出文件目录
        public static void createImage(String str, Font font, File outFile)
                throws Exception {
            int width = 40;
            int height = 40;
            // 创建图片
            BufferedImage image = new BufferedImage(width, height,
                    BufferedImage.TYPE_INT_BGR);
            Graphics g = image.getGraphics();
            g.setClip(0, 0, width, height);
            g.setColor(Color.white);
            g.fillRect(0, 0, width, height);// 先用黑色填充整张图片,也就是背景
            g.setColor(Color.red);// 在换成黑色
            g.setFont(font);// 设置画笔字体
            /** 用于获得垂直居中y */
            Rectangle clip = g.getClipBounds();
            FontMetrics fm = g.getFontMetrics(font);
            int ascent = fm.getAscent();
            int descent = fm.getDescent();
            int y = (clip.height - (ascent + descent)) / 2 + ascent;
            for (int i = 0; i < 6; i++) {// 256 340 0 680
                g.drawString(str, i * 680, y);// 画出字符串
            }
            g.dispose();
            ImageIO.write(image, "png", outFile);// 输出png图片
        }
    }

    作者:逆舟
    https://www.cnblogs.com/zy-jiayou/
    本博客文章均为作者原创,转载请注明作者和原文链接。
  • 相关阅读:
    常用git指令操作
    eclipse中常用快捷键整理
    Java Dom解析xml文件
    Spring IOC的注入方式
    Spring framework bean的作用域,生命周期
    android中的bundle使用
    python ftplib模块
    python requests用法总结
    限制字符串 剔除费需要字符然后将多余空格删除
    MFC Edit Control 编辑控件 属性和API
  • 原文地址:https://www.cnblogs.com/zy-jiayou/p/6206069.html
Copyright © 2011-2022 走看看