zoukankan      html  css  js  c++  java
  • java--实现将文字生成二维码图片,并在中间附上logo,下方附上文字

    前段时间因为工作需要,要实现将一段文字或者url生成二维码,然后中间附上logo,下方正中间附上文字的功能。

    上网找了几篇教程学习了下,由于没有保存借鉴的博文链接,所以就没po上参考文章的链接啦,感谢几位博主的分享~

    大概的实现效果如下图所示:

    实现步骤:

    (1)导入java_ZXing_jar包,点此下载jar包

    (2)编写画二维码代码

     1 package QRCode;
     2 
     3 import com.google.zxing.common.BitMatrix;
     4 import javax.imageio.ImageIO;
     5 import java.io.File;
     6 import java.io.OutputStream;
     7 import java.io.IOException;
     8 import java.awt.image.BufferedImage;
     9 
    10 public final class MatrixToImageWriter {
    11 
    12     private static final int BLACK = 0xFF000000;
    13     private static final int WHITE = 0xFFFFFFFF;
    14 
    15     private MatrixToImageWriter() {}
    16 
    17 
    18     public static BufferedImage toBufferedImage(BitMatrix matrix) {
    19         int width = matrix.getWidth();
    20         int height = matrix.getHeight();
    21         BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    22         for (int x = 0; x < width; x++) {
    23             for (int y = 0; y < height; y++) {
    24                 image.setRGB(x, y, matrix.get(x, y) ? BLACK : WHITE);
    25             }
    26         }
    27         return image;
    28     }
    29 
    30 
    31     public static void writeToFile(BitMatrix matrix, String format, File file)
    32             throws IOException {
    33         BufferedImage image = toBufferedImage(matrix);
    34         if (!ImageIO.write(image, format, file)) {
    35             throw new IOException("Could not write an image of format " + format + " to " + file);
    36         }
    37     }
    38 
    39 
    40     public static void writeToStream(BitMatrix matrix, String format, OutputStream stream)
    41             throws IOException {
    42         BufferedImage image = toBufferedImage(matrix);
    43         if (!ImageIO.write(image, format, stream)) {
    44             throw new IOException("Could not write an image of format " + format);
    45         }
    46     }
    47 
    48 }
    MatrixToImageWriter

    (3)编写一个类,用来设置中间logo的属性(注:代码中“照片的1/6”,应该是“二维码图片的1/6”,懒得重新上传代码,特此注释下)

     1 package QRCode;
     2 
     3 import java.awt.Color;
     4 
     5 public class LogoConfig {
     6     // logo默认边框颜色
     7     public static final Color DEFAULT_BORDERCOLOR = Color.WHITE;
     8     // logo默认边框宽度
     9     public static final int DEFAULT_BORDER = 2;
    10     // logo大小默认为照片的1/6
    11     public static final int DEFAULT_LOGOPART = 6;
    12  
    13     private final int border = DEFAULT_BORDER;
    14     private final Color borderColor;
    15     private final int logoPart;
    16  
    17     /**
    18      * Creates a default config with on color {@link #BLACK} and off color
    19      * {@link #WHITE}, generating normal black-on-white barcodes.
    20      */
    21     public LogoConfig()
    22     {
    23         this(DEFAULT_BORDERCOLOR, DEFAULT_LOGOPART);
    24     }
    25  
    26     public LogoConfig(Color borderColor, int logoPart)
    27     {
    28         this.borderColor = borderColor;
    29         this.logoPart = logoPart;
    30     }
    31  
    32     public Color getBorderColor()
    33     {
    34         return borderColor;
    35     }
    36  
    37     public int getBorder()
    38     {
    39         return border;
    40     }
    41  
    42     public int getLogoPart()
    43     {
    44         return logoPart;
    45     }
    46 }
    LogoConfig

    (4)为二维码图片添加logo

     1 /**
     2      * 给二维码图片添加Logo
     3      * 
     4      * @param qrPic
     5      * @param logoPic
     6      */
     7     public static void addLogo_QRCode(File qrPic, File logoPic, LogoConfig logoConfig)
     8     {
     9         try
    10         {
    11             if (!qrPic.isFile() || !logoPic.isFile())
    12             {
    13                 System.out.print("file not find !");
    14                 System.exit(0);
    15             }
    16 
    17             /**
    18              * 读取二维码图片,并构建绘图对象
    19              */
    20             BufferedImage image = ImageIO.read(qrPic);
    21             Graphics2D g = image.createGraphics();
    22 
    23             /**
    24              * 读取Logo图片
    25              */
    26             BufferedImage logo = ImageIO.read(logoPic);
    27 
    28             int widthLogo = image.getWidth()/logoConfig.getLogoPart(); 
    29         //    int    heightLogo = image.getHeight()/logoConfig.getLogoPart();
    30             int    heightLogo = image.getWidth()/logoConfig.getLogoPart(); //保持二维码是正方形的
    31 
    32             // 计算图片放置位置
    33             int x = (image.getWidth() - widthLogo) / 2;
    34             int y = (image.getHeight() - heightLogo) / 2 ;        
    35 
    36 
    37             //开始绘制图片
    38             g.drawImage(logo, x, y, widthLogo, heightLogo, null);
    39             g.drawRoundRect(x, y, widthLogo, heightLogo, 10, 10);
    40             g.setStroke(new BasicStroke(logoConfig.getBorder()));
    41             g.setColor(logoConfig.getBorderColor());
    42             g.drawRect(x, y, widthLogo, heightLogo);
    43 
    44             g.dispose();
    45 
    46             ImageIO.write(image, "jpeg", new File("D:/newPic.jpg"));
    47         }
    48         catch (Exception e)
    49         {
    50             e.printStackTrace();
    51         }
    52     }
    addLogo_QRCode

    (5)为添加好logo的二维码图片添加文字

     1 /**
     2      * @为图片添加文字
     3      * @param pressText 文字
     4      * @param newImg    带文字的图片
     5      * @param targetImg 需要添加文字的图片
     6      * @param fontStyle 
     7      * @param color
     8      * @param fontSize
     9      * @param width
    10      * @param heigh
    11      */
    12     public static void pressText(String pressText, String newImg, String targetImg, int fontStyle, Color color, int fontSize, int width, int height) {
    13         
    14         //计算文字开始的位置
    15         //x开始的位置:(图片宽度-字体大小*字的个数)/2
    16         int startX = (width-(fontSize*pressText.length()))/2;
    17         //y开始的位置:图片高度-(图片高度-图片宽度)/2
    18         int startY = height-(height-width)/2;        
    19         
    20         try {
    21             File file = new File(targetImg);
    22             Image src = ImageIO.read(file);
    23             int imageW = src.getWidth(null);
    24             int imageH = src.getHeight(null);
    25             BufferedImage image = new BufferedImage(imageW, imageH, BufferedImage.TYPE_INT_RGB);
    26             Graphics g = image.createGraphics();
    27             g.drawImage(src, 0, 0, imageW, imageH, null);
    28             g.setColor(color);
    29             g.setFont(new Font(null, fontStyle, fontSize));
    30             g.drawString(pressText, startX, startY);
    31             g.dispose();
    32 
    33             FileOutputStream out = new FileOutputStream(newImg);
    34             ImageIO.write(image, "JPEG", out);
    35             JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
    36             encoder.encode(image);
    37             out.close();
    38             System.out.println("image press success");
    39         } catch (Exception e) {
    40             System.out.println(e);
    41         }
    42     }
    pressText

    (6)上面功能写好后,可以综合一下进行测试

     1 public static void main(String args[]) {
     2         try {
     3             //二维码表示的内容
     4             String content = "http://www.cnblogs.com/";
     5             
     6             //存放logo的文件夹
     7             String path = "E:/QRCodeImage";
     8 
     9             MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
    10 
    11             @SuppressWarnings("rawtypes")
    12             Map hints = new HashMap();
    13             
    14             //设置UTF-8, 防止中文乱码
    15             hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
    16             //设置二维码四周白色区域的大小
    17             hints.put(EncodeHintType.MARGIN,1);
    18             //设置二维码的容错性
    19             hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); 
    20             
    21             //图片完整的宽;height:图片完整的高
    22             //因为要在二维码下方附上文字,所以把图片设置为长方形(高大于宽)
    23             int width = 400;
    24             int height = 450;
    25             
    26             //画二维码,记得调用multiFormatWriter.encode()时最后要带上hints参数,不然上面设置无效
    27             BitMatrix bitMatrix = multiFormatWriter.encode(content, BarcodeFormat.QR_CODE, width, height, hints);
    28             
    29             //qrcFile用来存放生成的二维码图片(无logo,无文字)
    30             File qrcFile = new File(path,"myPicture.jpg");
    31             //logoFile用来存放带有logo的二维码图片(二维码+logo,无文字)
    32             File logoFile = new File(path,"logo.jpg");
    33             
    34             //开始画二维码
    35             MatrixToImageWriter.writeToFile(bitMatrix, "jpg", qrcFile);
    36 
    37             //在二维码中加入图片
    38             LogoConfig logoConfig = new LogoConfig(); //LogoConfig中设置Logo的属性
    39             addLogo_QRCode(qrcFile, logoFile, logoConfig);
    40             
    41     
    42             int font = 18; //字体大小
    43             int fontStyle = 1; //字体风格
    44             
    45             //用来存放带有logo+文字的二维码图片
    46             String newImageWithText = "D:/imageWithText.jpg"; 
    47             //带有logo的二维码图片
    48             String targetImage = "D:/newPic.jpg";
    49             //附加在图片上的文字信息
    50             String text = "文字测试一二三四五六123";
    51 
    52             //在二维码下方添加文字(文字居中)
    53             pressText(text, newImageWithText, targetImage, fontStyle, Color.BLUE, font,  width,  height) ;
    54 
    55         } catch (Exception e) {
    56             e.printStackTrace();
    57         }
    58     }
    main

    注意:部分ZXing的jar包导入后,配置EncodeHintType.MARGIN会报错

    使用上面附上的java_ZXing_jar包即可。

    分享就到此结束啦~~

  • 相关阅读:
    Python—re模块
    Python—json模块
    Python—sys模块介绍
    Python—os模块介绍
    Python—randonm模块介绍
    Python—time模块介绍
    Python—包介绍
    Python—模块介绍
    Python—装饰器
    jvm、jre、jdk
  • 原文地址:https://www.cnblogs.com/lmei/p/4626042.html
Copyright © 2011-2022 走看看