java 简单快速的生成二维码(带图片)
2017-12-28 15:29
549 查看
**使用java+zxing 简单快速的生成二维码。**
效果图:
首先需要引入两个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. 9e12 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(); } }
我运行后的所有图片文件:
完事了,路过的大神请多多指点,谢谢
相关文章推荐
- Cage 是一个 Java 实现的验证码图片生成库,快速、小型和简单。
- 转:Java生成带有二维码图片的word文档
- [java]生成带logo图片的二维码、以及二维码解码
- JAVA生成二维码图片代码
- (转载)java zxing 生成带图片的二维码
- Java代码生成二维码图片
- JAVA生成二维码图片
- java生成二维码图片
- Java生成读取条形码和二维码图片(未测试)
- java--实现将文字生成二维码图片,并在中间附上logo,下方附上文字
- java使用zxing生成带logo的二维码图片
- 超简单的 Java+JS 图片验证码生成方式
- java如何生成二维码图片
- java如何生成二维码图片
- 使用zxing生成嵌图片的二维码【java】
- 使用zxing生成嵌图片的二维码【java】
- 超简单的python生成二维码图片
- java生成二维码图片
- 在线生成简单二维码图片
- java zxing 生成带图片的二维码