JAVA 简单快速的生成二维码(带图片)

首先需要引入两个jar文件:

    <dependency>

      <groupId>commons-codec</groupId>

      <artifactId>commons-codec</artifactId>

      <version>1.8</version>

    </dependency>

    <dependency>

      <groupId>com.google.zxing</groupId>

      <artifactId>javase</artifactId>

      <version>3.0.0</version>

    </dependency>


下面就是生成二维码的工具类:

    public class CreatrQrCode{

    // logo默认边框颜色

    public static final Color DEFAULT_BORDERCOLOR = Color.WHITE;

    // logo默认边框宽度

    public static final int DEFAULT_BORDER = 1;

    // logo大小默认为照片的1/6

    public static final int DEFAULT_LOGOPART = 6;

    private final int border = DEFAULT_BORDER;

    private final Color borderColor;

    private final int logoPart;

    /**

    * Creates a default config with on color {@link #BLACK} and off color

    * {@link #WHITE}, generating normal black-on-white barcodes.

    */

    public CreatrQrCode() {

        this(DEFAULT_BORDERCOLOR, DEFAULT_LOGOPART);

    }

    public demo02(Color borderColor, int logoPart) {

        this.borderColor = borderColor;

        this.logoPart = logoPart;

    }

    public Color getBorderColor() {

        return borderColor;

    }

    public int getBorder() {

        return border;

    }

    public int getLogoPart() {

        return logoPart;

    }

    /**

    * 给二维码图片添加Logo

    *

    * @param qrPic

    * @param logoPic

    */

    public static void addLogo_QRCode(File qrPic, File logoPic, CreatrQrCode logoConfig) {

        try {

            if (!qrPic.isFile() || !logoPic.isFile()) {

                System.out.print("file not find !");

                System.exit(0);

            }

            /**

            * 读取二维码图片,并构建绘图对象

            */

            BufferedImage image = ImageIO.read(qrPic);

            Graphics2D g = image.createGraphics();

            /**

            * 读取Logo图片

            */

            BufferedImage logo = ImageIO.read(logoPic);

            int widthLogo = image.getWidth() / logoConfig.getLogoPart();

            //    int    heightLogo = image.getHeight()/logoConfig.getLogoPart();

            int heightLogo = image.getWidth() / logoConfig.getLogoPart(); //保持二维码是正方形的

            // 计算图片放置位置

            int x = (image.getWidth() - widthLogo) / 2;

            int y = (image.getHeight() - heightLogo) / 2;

            //开始绘制图片

            g.drawImage(logo, x, y, widthLogo, heightLogo, null);

            g.drawRoundRect(x, y, widthLogo, heightLogo, 10, 10);

            g.setStroke(new BasicStroke(logoConfig.getBorder()));

            g.setColor(logoConfig.getBorderColor());

            g.drawRect(x, y, widthLogo, heightLogo);

            g.dispose();

            ImageIO.write(image, "jpeg", new File("D:/ceshi/789.png"));

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

    /**

    * @param pressText 文字

    * @param newImg    带文字的图片

    * @param targetImg 需要添加文字的图片

    * @param fontStyle

    * @param color

    * @param fontSize

    * @param width

    * @param height

    * @为图片添加文字

    */

    public static void pressText(String pressText, String newImg, String targetImg, int fontStyle, Color color, int fontSize, int width, int height) {

        //计算文字开始的位置

        //x开始的位置:(图片宽度-字体大小*字的个数)/2

        int startX = (width - (fontSize * pressText.length())) / 2;

        //y开始的位置:图片高度-(图片高度-图片宽度)/2

        int startY = height - (height - width) / 2;

        try {

public class CreatrQrCode {

    // logo默认边框颜色

    public static final Color DEFAULT_BORDERCOLOR = Color.WHITE;

    // logo默认边框宽度

    public static final int DEFAULT_BORDER = 1;

    // logo大小默认为照片的1/6

    public static final int DEFAULT_LOGOPART = 6;

    private final int border = DEFAULT_BORDER;

    private final Color borderColor;

    private final int logoPart;

    /**

    * Creates a default config with on color {@link #BLACK} and off color

    * {@link #WHITE}, generating normal black-on-white barcodes.

    * 在颜色{@ link #黑}和颜色上创建一个默认配置

    *  {@link # WHITE},生成正常的黑白条码。

    */

    public CreatrQrCode() {

        this(DEFAULT_BORDERCOLOR, DEFAULT_LOGOPART);

    }

    public CreatrQrCode(Color borderColor, int logoPart) {

        this.borderColor = borderColor;

        this.logoPart = logoPart;

    }

    public Color getBorderColor() {

        return borderColor;

    }

    public int getBorder() {

        return border;

    }

    public int getLogoPart() {

        return logoPart;

    }

    /**

    * 给二维码图片添加Logo

    *

    * @param qrPic

    * @param logoPic

    */

    public static void addLogo_QRCode(File qrPic, File logoPic, CreatrQrCode creatrQrCode) {

        try {

            if (!qrPic.isFile() || !logoPic.isFile()) {

                System.out.print("file not find !");

                System.exit(0);

            }

            /**

            * 读取二维码图片,并构建绘图对象

            */

            BufferedImage image = ImageIO.read(qrPic);

            Graphics2D g = image.createGraphics();

            /**

            * 读取Logo图片

            */

            BufferedImage logo = ImageIO.read(logoPic);

            int widthLogo = image.getWidth() / creatrQrCode.getLogoPart();

            //    int    heightLogo = image.getHeight()/logoConfig.getLogoPart();

            int heightLogo = image.getWidth() / creatrQrCode.getLogoPart(); //保持二维码是正方形的

            // 计算图片放置位置

            int x = (image.getWidth() - widthLogo) / 2;

            int y = (image.getHeight() - heightLogo) / 2;

            //开始绘制图片

            g.drawImage(logo, x, y, widthLogo, heightLogo, null);

            g.drawRoundRect(x, y, widthLogo, heightLogo, 10, 10);

            g.setStroke(new BasicStroke(creatrQrCode.getBorder()));

            g.setColor(creatrQrCode.getBorderColor());

            g.drawRect(x, y, widthLogo, heightLogo);

            g.dispose();

            ImageIO.write(image, "jpeg", new File("D:/ceshi/789.png"));

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

    /**

    * @param pressText 文字

    * @param newImg    带文字的图片

    * @param targetImg 需要添加文字的图片

    * @param fontStyle

    * @param color

    * @param fontSize

    * @param width

    * @param height

    * @为图片添加文字

    */

    public static void pressText(String pressText, String newImg, String targetImg, int fontStyle, Color color, int fontSize, int width, int height) {

        //计算文字开始的位置

        //x开始的位置:(图片宽度-字体大小*字的个数)/2

        int startX = (width - (fontSize * pressText.length())) / 300;

        //y开始的位置:图片高度-(图片高度-图片宽度)/2

        int startY = height - (height - width) / 3;

        try {

            File file = new File(targetImg);

            Image src = ImageIO.read(file);

            int imageW = src.getWidth(null);

            int imageH = src.getHeight(null);

            BufferedImage image = new BufferedImage(imageW, imageH, BufferedImage.TYPE_INT_RGB);

            Graphics g = image.createGraphics();

            g.drawImage(src, 0, 0, imageW, imageH, null);

            g.setColor(color);

            g.setFont(new Font(null, fontStyle, fontSize));

            g.drawString(pressText, startX, startY);

            g.dispose();

            FileOutputStream out = new FileOutputStream(newImg);

            ImageIO.write(image, "JPEG", out);

            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);

            encoder.encode(image);

            out.close();

            System.out.println("image press success");

        } catch (Exception e) {

            System.out.println(e);

        }

    }

}


在主函数中测试一下我们的的工具类有没有问题:

public static void main(String args[]) {

        try {

            //二维码表示的内容

            String content = "http://www.baidu.com";

            //存放logo的文件夹

            String path = "D:/ceshi/";

            MultiFormatWriter

                    multiFormatWriter = new MultiFormatWriter();

            @SuppressWarnings("rawtypes")

            Map hints = new HashMap();

            //设置UTF-8, 防止中文乱码

            hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");

            //设置二维码四周白色区域的大小

            hints.put(EncodeHintType.MARGIN,0);

            //设置二维码的容错性

                hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);

            //width:图片完整的宽;height:图片完整的高

            //因为要在二维码下方附上文字,所以把图片设置为长方形(高大于宽)

            int width = 400;

            int height = 460;

            //画二维码,记得调用multiFormatWriter.encode()时最后要带上hints参数,不然上面设置无效

            BitMatrix bitMatrix = multiFormatWriter.encode(content, BarcodeFormat.QR_CODE, width, height, hints);

            //qrcFile用来存放生成的二维码图片(无logo,无文字)

            File qrcFile = new File(path,"wutu.jpg");

            //logoFile准备放在二维码中的图片(path:图片路径,图片名称)

            File logoFile = new File(path,"shilinwei.jpg");

            //开始画二维码

            MatrixToImageWriter.writeToFile(bitMatrix, "jpg", qrcFile);

            //在二维码中加入图片

            CreatrQrCode creatrQrCode = new CreatrQrCode(); //LogoConfig中设置Logo的属性

            addLogo_QRCode(qrcFile, logoFile, creatrQrCode);

            int font = 20; //字体大小

            int fontStyle = 4; //字体风格

            //用来存放的带有logo+文字的二维码图片

            String newImageWithText = "D:/ceshi/456.jpg";

            //带有logo二维码图片

            String targetImage = "D:/ceshi/789.png";

            //附加在图片上的文字信息

            String text = "my name is Shi Linwei";

            //在二维码下方添加文字(文字居中)

            pressText(text, newImageWithText, targetImage, fontStyle, Color.red, font,  width,  height) ;

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

原文链接:https://blog.csdn.net/qq_36481052/article/details/78922725

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,009评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,808评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,891评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,283评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,285评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,409评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,809评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,487评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,680评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,499评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,548评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,268评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,815评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,872评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,102评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,683评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,253评论 2 341

推荐阅读更多精彩内容