java 通过Qrcode生成二维码添加图片logo和文字描述

/**
 *  二维码创建
 * @author yhzm
 *
 */
public class printServiceImpl extends BaseService {
     public void barCodeGenera() {
             init(false);
             //先创建一个二维码
             String text = strRequiredParam("barcode","二维码信息");
             String desc = strRequiredParam("desc","文字内容");//二维码下面的文字描述
             String logoPath = "d:\\aa.png";//二维码的logo地址
            int logoWidth = 40; //logo的宽
            int logoHeight = 40;  //logo的高
            try{
                 Qrcode qrcode = new Qrcode();
                 qrcode.setQrcodeErrorCorrect(‘M‘);//设置纠错等级(分为:L、M、H三个等级)
                 qrcode.setQrcodeEncodeMode(‘B‘);//N代表数字、A代表a-Z、B代表其他字符
                 qrcode.setQrcodeVersion(7);//设置版本

                 int width = 67+12*(7-1);//设置二维码的宽  二维码像素的大小和版本号有关  但是版本号越大   二维码也越是复杂  这个需要注意
                 int height = 67+12*(7-1);//设置二维码的高
                 //将内容变为特定UTF-8格式编码的字节码
                 byte [] qrData = text.getBytes("UTF-8");

                 BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
                 //创造画笔
                 Graphics2D gs = bufferedImage.createGraphics();
                 gs.setBackground(Color.WHITE);//设置背景
                 gs.setColor(Color.BLACK);//设置画笔颜色
                 gs.clearRect(0, 0, width, height);//清除画板内容
                 //设置偏移量
                 int pixoff = 2;
                 boolean [][] d = qrcode.calQrcode(qrData);
                 for(int y=0;y<d.length;y++) {
                     for(int x=0;x<d.length;x++) {
                         if(d[x][y]) {
                             gs.fillRect(x*3+pixoff, y*3+pixoff, 3, 3);
                         }
                     }
                 }
                 gs.dispose();
                BufferedImage bm = bufferedImage;//二维码
                File logoFile = new File(logoPath); //logo图片
                BufferedImage logoImg = ImageIO.read(logoFile);
                /* float ratio = 0.5;   //倒圆角
                 if(ratio>0){
                     logoWidth = logoWidth>width*ratio ? (int)(width*ratio) : logoWidth;
                     logoHeight = logoHeight>height*ratio ? (int)(height*ratio) : logoHeight;
                 }  */
                int x = (width-logoWidth)/2;
                int y = (height-logoHeight)/2;
                Graphics g = bm.getGraphics();
                g.drawImage(logoImg, x, y, logoWidth, logoHeight, null);
                int whiteWidth = 0;  //白边
                Font font = new Font("黑体", Font.BOLD, 12);
                int fontHeight = g.getFontMetrics(font).getHeight();//得到字体的高度
                //计算需要多少行
                int lineNum = 1;
                int currentLineLen = 0;
                for(int i=0;i<desc.length();i++){
                    char c = desc.charAt(i);
                    int charWidth = g.getFontMetrics(font).charWidth(c);
                    //循环文字得到文字区域的行数
                    if(currentLineLen+charWidth>width){
                        lineNum++;
                        currentLineLen = 0;
                        continue;
                    }
                    currentLineLen += charWidth;
                }
                int totalFontHeight = fontHeight*lineNum; //得到文字区域的高度
                int wordTopMargin = 4;
                BufferedImage bm1 = new BufferedImage(width, height+totalFontHeight+wordTopMargin-whiteWidth, BufferedImage.TYPE_INT_RGB); //创建将文字高度计算到其中的图片
                Graphics g1 = bm1.getGraphics();
                g1.setColor(Color.WHITE);
                g1.fillRect(0, height, width, totalFontHeight+wordTopMargin-whiteWidth); //将文字部分的背景填充成白色
                g1.setColor(Color.black);
                g1.setFont(font);
                g1.drawImage(bm, 0, 0, null); //将创建好的二维码从起点(0,0)开始画在图中
                int currentLineIndex = 0;
                //判断是否只有一行,只有一行就居中显示
                currentLineLen = lineNum-1==currentLineIndex?(width-g.getFontMetrics(font).stringWidth(desc))/2:0;
                int baseLo = g1.getFontMetrics().getAscent();
                for(int i=0;i<desc.length();i++){
                    String c = desc.substring(i, i+1);
                    int charWidth = g.getFontMetrics(font).stringWidth(c);
                    //判断是否需要换行
                    if(currentLineLen+charWidth>width){
                        currentLineIndex++;
                        //判断是否是最后一行  最后一行居中显示
                        currentLineLen = lineNum-1==currentLineIndex?(width-g.getFontMetrics(font).stringWidth(desc.substring(i)))/2:0;
                        g1.drawString(c, currentLineLen + whiteWidth, height+baseLo+fontHeight*(currentLineIndex)+wordTopMargin);//将单个文字画到对应位置
                        currentLineLen = charWidth;
                        continue;
                    }
                    g1.drawString(c, currentLineLen+whiteWidth, height+baseLo+fontHeight*(currentLineIndex) + wordTopMargin);
                    currentLineLen += charWidth;
                }
                g1.dispose();
                bm = bm1;
             response.setContentType("image/jpeg");
             //好了 ,现在通过IO流来传送数据
            ImageIO.write(bm , "JPEG", response.getOutputStream());
        }catch(Throwable e){
            e.printStackTrace();
        }
    }
}

这个可以用来生成二维码,并且携带log和文字。

原文地址:https://www.cnblogs.com/qingmuchuanqi48/p/12079384.html

时间: 2024-10-07 09:24:07

java 通过Qrcode生成二维码添加图片logo和文字描述的相关文章

java 使用qrcode生成二维码图片或者base64字符串

通过传入字符串,生成二维码图片或者base64格式字符串 1 public static String barcode2Base64(String msg) throws Exception{ 2 Qrcode x = new Qrcode(); 3 //N代表数字,A代表a-z,B代表其他字符 4 x.setQrcodeEncodeMode('B'); 5 //设置纠错等级 6 x.setQrcodeErrorCorrect('M'); 7 //设置版本号(1-40) 8 x.setQrcod

java生成二维码(带logo)

之前写过一篇不带logo的二维码实现方式,采用QRCode和ZXing两种方式 http://blog.csdn.net/xiaokui_wingfly/article/details/39476185 这里介绍一下ZXing的带logo实现方式,具体实现参考一下代码,测试使用ZXingCodeUtil的main方法. 视频链接地址稍后更新,视频地址中包含图片二维码流输出方式 LogoConfig logo背景配置类 ZXingConfig 二维码配置信息 BufferedImageLumina

java学习-zxing生成二维码矩阵的简单例子

这个例子需要使用google的开源项目zxing的核心jar包 core-3.2.0.jar 可以百度搜索下载jar文件 也可使用maven添加依赖 <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.2.0</version> </dependency> 最简单的生成二维码的方法,

Java根据链接生成二维码

Java根据链接生成二维码 相关 jar 包: core-3.1.0.jar 源码及 jar 包下载:http://files.cnblogs.com/files/liaolongjun/qrcode.zip 可直接运行: package llj.mf.utils; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.io.OutputStream; i

Pyqt+QRcode 生成二维码

python生成二维码是件很简单的事,使用第三方库Python QRCode就可生成二维码,我用Pyqt给QRcode打个壳 一.python-qrcode介绍 python-qrcode是个用来生成二维码图片的第三方模块,依赖于 PIL 模块和 qrcode 库. PIL下载地址: https://pypi.python.org/pypi/PIL/1.1.6         或 http://www.pythonware.com/products/pil/ qrcode下载地址: https:

asp.net(C#)利用QRCode生成二维码(续)-在二维码图片中心加Logo或图像 .

<%@ WebHandler Language="C#" Class="GetQRCode" %> using System; using System.Web; using ThoughtWorks.QRCode.Codec; using ThoughtWorks.QRCode.Codec.Data; using ThoughtWorks.QRCode.Codec.Util; using System.IO; using System.Text; us

C# 利用QRCode生成二维码图片

引用LYBwwp的博文http://blog.csdn.net/lybwwp/article/details/18444369 网上生成二维码的组件是真多,可是真正好用的,并且生成速度很快的没几个,QRCode就是我在众多中找到的,它的生成速度快.但是网上关于它的使用说明,真的太少了,大都是千篇一律的复制粘贴.这是本要用它做了一个项目后,简单的整理了一下. 组件下载地址:http://download.csdn.net/detail/lybwwp/6861821 下载文件包包含ThoughtWo

Qrcode生成二维码的参数总结 及最小尺寸的测试

Qrcode生成二维码,做过很多实验,探索最小规格的二维码到底是多少尺寸,和最高规格的二维码到底是多大尺寸.现在我总结总结: 有两种思路: 1.生成规格高的二维码,然后压缩到自己想要的尺寸的二维码.这种:压缩算法不好的时候会很坑爹. 2.根据调整的参数生成原图,这种图是比较清晰的,打印出来都可以很好的被识别. 先说说第二种吧:根据测试, 1.不设置任何东西时:根据测试 最小的二维码尺寸是45--47:宽高(对于1---14个字符), 第二梯度:54-56:宽高(对于15--26字符) 第三梯度:

python_使用qrcode生成二维码

1.功能 使用qrcode生成二维码 2.代码 #生成二维码: import qrcode #根据url生成二维码 def qrcodeWithUrl(url): img = qrcode.make(url) savePath = "1.png" img.save(savePath) #根据输入的文字生成二维码 def qrcodeWithText(text): img = qrcode.make(text) savePath = "2.png" img.save(