直接上代码,以后有时间再添加说明
二维码的基本信息,包括要二维码内包含的文字,嵌入的图片,加到二维码下边的文字
/** * */ package com.tong.util.code; import java.io.File; /** * @author zxm * */ public class CodeModel { private String contents; private int width = 400; private int height = 400; private String format = "gif"; private String character_set = "utf-8"; private int fontSize = 12; private File logoFile; private float logoRatio = 0.20f; private String desc; private int whiteWidth;//白边的宽度 private int[] bottomStart;//二维码最下边的开始坐标 private int[] bottomEnd;//二维码最下边的结束坐标 public String getContents() { return contents; } public void setContents(String contents) { this.contents = contents; } public int getWidth() { return width; } public void setWidth(int width) { this.width = width; } public int getHeight() { return height; } public void setHeight(int height) { this.height = height; } public String getFormat() { return format; } public void setFormat(String format) { this.format = format; } public String getCharacter_set() { return character_set; } public void setCharacter_set(String character_set) { this.character_set = character_set; } public int getFontSize() { return fontSize; } public void setFontSize(int fontSize) { this.fontSize = fontSize; } public File getLogoFile() { return logoFile; } public void setLogoFile(File logoFile) { this.logoFile = logoFile; } public float getLogoRatio() { return logoRatio; } public void setLogoRatio(float logoRatio) { this.logoRatio = logoRatio; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } public int getWhiteWidth() { return whiteWidth; } public void setWhiteWidth(int whiteWidth) { this.whiteWidth = whiteWidth; } public int[] getBottomStart() { return bottomStart; } public void setBottomStart(int[] bottomStart) { this.bottomStart = bottomStart; } public int[] getBottomEnd() { return bottomEnd; } public void setBottomEnd(int[] bottomEnd) { this.bottomEnd = bottomEnd; } }
生成二维码
/** * */ package com.tong.util.code; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.HashMap; import java.util.Map; import javax.imageio.ImageIO; import org.springframework.util.StringUtils; import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.google.zxing.MultiFormatWriter; import com.google.zxing.WriterException; import com.google.zxing.common.BitMatrix; import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; /** * @author zxm * */ public class CodeCreator { private static int BLACK = 0x000000; private static int WHITE = 0xFFFFFF; private BufferedImage createCodeImage(CodeModel info){ String contents = info.getContents(); int width = info.getWidth(); int height = info.getHeight(); Map<EncodeHintType, Object> hint = new HashMap<>(); hint.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); hint.put(EncodeHintType.CHARACTER_SET, info.getCharacter_set()); hint.put(EncodeHintType.MARGIN, 0); MultiFormatWriter writer = new MultiFormatWriter(); BufferedImage img = null; try { BitMatrix bm = writer.encode(contents, BarcodeFormat.QR_CODE, width, height, hint); int[] locationTopLeft = bm.getTopLeftOnBit(); int[] locationBottomRight = bm.getBottomRightOnBit(); info.setBottomStart(new int[]{locationTopLeft[0], locationBottomRight[1]}); info.setBottomEnd(locationBottomRight); int w = bm.getWidth(); int h = bm.getHeight(); img = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); for(int x=0;x<w;x++){ for(int y=0;y<h;y++){ img.setRGB(x, y, bm.get(x, y) ? BLACK : WHITE); } } } catch (WriterException e) { e.printStackTrace(); } return img; } public void createCodeImage(CodeModel info, OutputStream output){ BufferedImage bm = createCodeImage(info); File logoFile = info.getLogoFile(); if(logoFile!=null && logoFile.exists()){ try{ BufferedImage logoImg = ImageIO.read(logoFile); int logoWidth = logoImg.getWidth(); int logoHeight = logoImg.getHeight(); int width = bm.getWidth(); int height = bm.getHeight(); float ratio = info.getLogoRatio(); 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); String desc = info.getDesc(); //int whiteWidth = 8; if(!StringUtils.isEmpty(desc)){ int whiteWidth = info.getHeight()-info.getBottomEnd()[1]; // width = info.getBottomEnd()[0]-info.getBottomStart()[0]; // height = info.getBottomEnd()[1]+1; Font font = new Font("黑体", Font.BOLD, info.getFontSize()); 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(); if(totalFontHeight+wordTopMargin-whiteWidth>0){ g1.setColor(Color.WHITE); g1.fillRect(0, height, width, totalFontHeight+wordTopMargin-whiteWidth); } g1.setColor(new Color(BLACK)); g1.setFont(font); g1.drawImage(bm, 0, 0, null); width = info.getBottomEnd()[0]-info.getBottomStart()[0]; height = info.getBottomEnd()[1]+1; currentLineLen = 0; int currentLineIndex = 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 = 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; } }catch(Exception e){ e.printStackTrace(); } } try{ ImageIO.write(bm, StringUtils.isEmpty(info.getFormat()) ? info.getFormat() : info.getFormat(), output); }catch(Exception e){ e.printStackTrace(); } } public void createCodeImage(CodeModel info, File file){ File parent = file.getParentFile(); if(!parent.exists())parent.mkdirs(); OutputStream output = null; try{ output = new BufferedOutputStream(new FileOutputStream(file)); createCodeImage(info, output); output.flush(); }catch(Exception e){ e.printStackTrace(); }finally{ try { output.close(); } catch (IOException e) { e.printStackTrace(); } } } public void createCodeImage(CodeModel info, String filePath){ createCodeImage(info, new File(filePath)); } }
二维码读取
/** * */ package com.tong.util.code; import java.awt.image.BufferedImage; import java.io.InputStream; import java.util.HashMap; import java.util.Map; import javax.imageio.ImageIO; import com.google.zxing.BarcodeFormat; import com.google.zxing.BinaryBitmap; import com.google.zxing.DecodeHintType; import com.google.zxing.LuminanceSource; import com.google.zxing.RGBLuminanceSource; import com.google.zxing.Result; import com.google.zxing.common.HybridBinarizer; import com.google.zxing.qrcode.QRCodeReader; /** * @author zxm * */ public class CodeDecoder { public String decode(InputStream input){ Map<DecodeHintType, Object> hint = new HashMap<DecodeHintType, Object>(); hint.put(DecodeHintType.POSSIBLE_FORMATS, BarcodeFormat.QR_CODE); String result = ""; try{ BufferedImage img = ImageIO.read(input); int[] pixels = img.getRGB(0, 0, img.getWidth(), img.getHeight(), null, 0, img.getWidth()); LuminanceSource source = new RGBLuminanceSource(img.getWidth(), img.getHeight(), pixels); BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); QRCodeReader reader = new QRCodeReader(); Result r = reader.decode(bitmap, hint); result = r.getText(); }catch(Exception e){ result="读取错误"; } return result; } }
测试代码
/** * */ package com.tong.util; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.util.HashMap; import java.util.Map; import javax.imageio.ImageIO; import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.google.zxing.MultiFormatWriter; import com.google.zxing.WriterException; import com.google.zxing.common.BitMatrix; import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; import com.tong.util.code.CodeCreator; import com.tong.util.code.CodeDecoder; import com.tong.util.code.CodeModel; /** * @author zxm * */ public class QRCodeMain{ private static void encode() { CodeCreator creator = new CodeCreator(); CodeModel info = new CodeModel(); info.setWidth(400); info.setHeight(400); info.setFontSize(24); info.setContents("<a href='http://www.sohu.com'>人生就是拼搏</a>"); //info.setContents("http://www.sohu.com"); info.setContents("万水千山只等闲\n小荷才楼尖尖角\n谁家新燕啄春泥\n无边光景一时新\n万水千山只等闲\n小荷才楼尖尖角\n谁家新燕啄春泥\n无边光景一时新\n万水千山只等闲\n小荷才楼尖尖角\n谁家新燕啄春泥\n无边光景一时新\n万水千山只等闲\n小荷才楼尖尖角\n谁家新燕啄春泥\n无边光景一时新\n万水千山只等闲\n小荷才楼尖尖角\n谁家新燕啄春泥\n无边光景一时新\n万水千山只等闲\n小荷才楼尖尖角\n谁家新燕啄春泥\n无边光景一时新\n万水千山只等闲\n小荷才楼尖尖角\n谁家新燕啄春泥\n无边光景一时新\n万水千山只等闲\n小荷才楼尖尖角\n谁家新燕啄春泥\n无边光景一时新\n万水千山只等闲\n小荷才楼尖尖角\n谁家新燕啄春泥\n无边光景一时新\n万水千山只等闲\n小荷才楼尖尖角\n谁家新燕啄春泥\n无边光景一时新\n万水千山只等闲\n小荷才楼尖尖角\n谁家新燕啄春泥\n无边光景一时新\n万水千山只等闲\n小荷才楼尖尖角\n谁家新燕啄春泥\n无边光景一时新\n万水千山只等闲\n小荷才楼尖尖角\n谁家新燕啄春泥\n无边光景一时新\n万水千山只等闲\n小荷才楼尖尖角\n谁家新燕啄春泥\n无边光景一时新"); info.setLogoFile(new File("D:/workspaces/workspace1/tong3/WebContent/img/girl3.jpg")); info.setDesc("你怎么会知道我的苦,我是一页孤舟,漂流在尘世中asdfsaf33333abCD1234567890"); //info.setLogoDesc("一叶浮萍归大海,adsasfbhtjg人生何处不相逢"); //info.setLogoDesc("一叶浮萍"); creator.createCodeImage(info, "D:/2Dcode/dest." + info.getFormat()); } static public void decode(InputStream input){ CodeDecoder decoder = new CodeDecoder(); String result = decoder.decode(input); System.out.println(result); } public static void main(String[] args) throws Exception{ encode(); //decode(new FileInputStream(new File("D:/2Dcode/dest.gif"))); } }
相关推荐
在Java环境下,使用ZXing生成二维码的步骤如下: 1. 引入ZXing库:在项目中添加ZXing的依赖,通常通过Maven或Gradle来管理。对于Maven,可以在pom.xml文件中添加如下依赖: ```xml <groupId>com.google.zxing</...
这是Zxing的源码,没有打包成jar利于学习使用。...使用时注意path的默认地址,Main类中是生成二维码的代码,GetMain类中是读取二维码的代码。 eclipse中Ctrl+Shift+R快速查找类 希望对你有所帮助。
- **可选文字**:用户可以在生成的二维码中添加文字信息,这可能是对二维码内容的简短说明或补充,使得二维码不仅有数据交换功能,还具备一定的展示效果。 - **指定保存路径**:ZXingCodeUtils提供了将生成的...
该工具类目前比较简单,只是实现了普通二维码、logo二维码、彩色二维码和二维码条形码解析几个功能。 根据此工具类可扩展生成LOGO+文字的二维码,暂时不需要没有封装。
本文将详细解析标题为“C# 生成二维码源码 可生成图片 底部可显示文字”的知识内容,以及如何在C#环境中实现这一功能。 首先,C#是微软开发的一种面向对象的编程语言,它具有丰富的类库和强大的.NET框架支持,非常...
在iReport中生成二维码,我们需要引入ZXing库,这是一个开源的二维码生成和读取库。 1. 引入库:ZXing的javase.jar和core-3.0.0.jar需要添加到项目的类路径中,以支持二维码的生成。 2. 使用自定义函数:由于...
《Zxing:全方位解析二维码生成与扫描》 Zxing,全称“Zebra Crossing”,是一款开源的、跨...通过`DemoZXing-master`这样的实战项目,开发者可以更加深入地理解和运用Zxing,为自己的应用程序添加更多的实用功能。
在IT行业中,生成二维码、图片合成以及在图片上添加文字是常见的图像处理任务,尤其是在移动应用、营销推广和数据交换等领域。本资源包提供了一个基于Java的解决方案,使用了ZXing库(Zebra Crossing)和Java 2D图形...
- 使用ZXing库生成二维码时,首先需要引入对应的依赖,例如在Java项目中,可以添加ZXing的Maven或Gradle依赖。 - 创建`MultiFormatWriter`对象,它可以处理多种编码格式。 - 使用`BitMatrix`类来创建二维码的二...
对于初学者,可以通过研究这个例子了解如何在自己的项目中集成ZXing,如何生成二维码图片,以及如何处理扫描事件。同时,也可以根据需求自定义扫描界面,优化扫描性能,或增加错误处理机制。 9. **拓展应用** ...
如果这是一个实际的API调用流程,我们可以创建一个RESTful接口,接受请求参数(如内容、Logo路径、文字说明等),然后调用`ZXingCode.createQRCodeWithLogoAndText`方法生成二维码图片并返回。 6. **SpringBoot集成...
这段代码中,`GenerateQRCode`函数接收内容字符串和图片尺寸作为参数,返回一个包含该内容的二维码位图。`BarcodeWriter`类用于创建二维码,`EncodingOptions`设置二维码的宽度和高度。 四、使用QRCoder生成二维码 ...
4. **添加提示语**:在二维码下方添加文字提示,帮助读者理解二维码包含的信息,比如“扫描二维码获取完整文章”或“保存此二维码以访问我们的官方网站”。 5. **导入Word**:将生成的二维码图片复制到剪贴板,打开...
在Java工程中使用ZXing生成二维码,首先需要将库的依赖引入项目。这里提到的"com文件夹"包含了ZXing库的Java源代码,解压后将其放入项目的`src`目录下,意味着开发者可以直接使用这些源代码,而无需通过Maven或...
在本文中,我们将深入探讨如何使用C#编程语言结合Zxing.Net库来生成条形码和二维码,并且实现它们的打印和解码功能。Zxing.Net是一个强大的开源库,它为.NET开发者提供了读取和生成多种条形码和二维码的能力。在...
使用ZXing生成二维码的基本步骤如下: 1. 引入ZXing库:在项目中添加ZXing的依赖,如果是Maven项目,可以在pom.xml文件中添加对应的dependency。 2. 创建二维码内容:定义要编码的数据,可以是字符串、URL或其他可...
C#使用ZXing.Net生成二维码和条形码,可以输入的内容生成条码,可以设置条码的宽度和高度,以及各种条码类型,还可以通过拖拽直接识别条码内容 具体操作见:...
在生成二维码时,除了基础的编码数据,还可以选择性地添加图标(Logo)到二维码中心,以及在二维码周围添加辅助文字信息。这需要调整二维码生成器的配置,同时可能涉及到图像合成的技术,即将图标和文字与二维码图像...
这个工具类主要用于生成二维码图片。它首先会调用Zxing中的`MultiFormatWriter`来编码输入的文本数据,然后使用`BitMatrix`对象来存储这些数据。接着,`BitMatrix`会被转化为一个二维的像素数组,最后通过`Bitmap....
三、使用ZXing生成二维码的步骤 1. 添加依赖:首先,你需要将ZXing库引入到你的项目中。如果是Java或Android项目,可以通过Maven或Gradle添加依赖;对于.NET项目,可以使用NuGet包管理器。 2. 创建编码内容:确定你...