您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
今天就跟大家聊聊有关在java项目中使用jar包怎么实现一个二维码生成功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
第一步 导入,maven依赖或者下载指定jar包
<!-- https://mvnrepository.com/artifact/com.google.zxing/javase --> <dependency> <groupId>com.google.zxing</groupId> <artifactId>javase</artifactId> <version>3.2.1</version> </dependency>
第二步 书写二维码生成器的工具类
import java.awt.Color; import java.io.File; import java.util.Hashtable; import com.google.zxing.EncodeHintType; import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; /** * QRCode 生成器的格式 * * @author ai(ahx.show) */ public class QRCodeFormat { /** 图片大小 */ private int size; /** 内容编码格式 */ private String encode; /** 错误修正等级 (Error Collection Level) */ private ErrorCorrectionLevel errorCorrectionLevel; /** 错误修正等级的具体值 */ private double errorCorrectionLevelValue; /** 前景色 */ private Color foreGroundColor; /** 背景色 */ private Color backGroundColor; /** 图片的文件格式 */ private String imageFormat; /** 图片的外边距大小 (Quiet Zone) */ private int margin; /** 提供给编码器额外的参数 */ private Hashtable<EncodeHintType, Object> hints; /** 需要添加的图片 */ private File icon; /** * 创建一个带有默认值的 QRCode 生成器的格式。默认值如下 * * <ul> * <li>图片大小: 256px</li> * <li>内容编码格式: UTF-8</li> * <li>错误修正等级: Level M (有15% 的内容可被修正)</li> * <li>前景色: 黑色</li> * <li>背景色: 白色</li> * <li>输出图片的文件格式: png</li> * <li>图片空白区域大小: 0个单位</li> * </ul> * * @return QRCode 生成器格式 */ public static QRCodeFormat NEW() { return new QRCodeFormat(); } private QRCodeFormat() { this.size = 256; this.encode = "utf-8"; this.errorCorrectionLevel = ErrorCorrectionLevel.M; this.errorCorrectionLevelValue = 0.15; this.foreGroundColor = Color.BLACK; this.backGroundColor = Color.WHITE; this.imageFormat = "png"; this.margin = 0; this.hints = new Hashtable<EncodeHintType, Object>(); } /** * 返回图片的大小。 * * @return 图片的大小 */ public int getSize() { return this.size; } /** * 设置图片的大小。图片的大小等于实际内容与外边距的值(建议设置成偶数值)。 * * @param size * 图片的大小 * * @return QRCode生成器的格式 */ public QRCodeFormat setSize(int size) { this.size = size; return this; } /** * 返回内容编码格式。 * * @return 内容编码格式 */ public String getEncode() { return encode; } /** * 设置内容编码格式。 * * @param encode * 内容编码格式 * * @return QRCode生成器的格式 */ public QRCodeFormat setEncode(String encode) { this.encode = encode; return this; } /** * 返回错误修正等级。 * * @return 错误修正等级 */ public ErrorCorrectionLevel getErrorCorrectionLevel() { return errorCorrectionLevel; } /** * 返回错误修正等级的具体值。 * * @return 错误修正等级的具体值 */ public double getErrorCorrectionLevelValue() { return errorCorrectionLevelValue; } /** * 设置错误修正等级。其定义如下 * * <ul> * <li>L: 有 7% 的内容可被修正</li> * <li>M: 有15% 的内容可被修正</li> * <li>Q: 有 25% 的内容可被修正</li> * <li>H: 有 30% 的内容可被修正</li> * </ul> * * @param errorCorrectionLevel * 错误修正等级 * * @return QRCode生成器的格式 */ public QRCodeFormat setErrorCorrectionLevel(char errorCorrectionLevel) { switch (Character.toUpperCase(errorCorrectionLevel)) { case 'L': this.errorCorrectionLevel = ErrorCorrectionLevel.L; this.errorCorrectionLevelValue = 0.07; break; case 'M': this.errorCorrectionLevel = ErrorCorrectionLevel.M; this.errorCorrectionLevelValue = 0.15; break; case 'Q': this.errorCorrectionLevel = ErrorCorrectionLevel.Q; this.errorCorrectionLevelValue = 0.25; break; case 'H': this.errorCorrectionLevel = ErrorCorrectionLevel.H; this.errorCorrectionLevelValue = 0.3; break; default: this.errorCorrectionLevel = ErrorCorrectionLevel.M; } return this; } /** * 返回前景色。 * * @return 前景色 */ public Color getForeGroundColor() { return foreGroundColor; } /** * 设置前景色。值为十六进制的颜色值(与 CSS 定义颜色的值相同,不支持简写),可以忽略「#」符号。 * * @param foreGroundColor * 前景色的值 * * @return QRCode生成器的格式 */ public QRCodeFormat setForeGroundColor(String foreGroundColor) { try { this.foreGroundColor = getColor(foreGroundColor); } catch (NumberFormatException e) { this.foreGroundColor = Color.BLACK; } return this; } /** * 设置前景色。 * * @param foreGroundColor * 前景色的值 * * @return QRCode生成器的格式 */ public QRCodeFormat setForeGroundColor(Color foreGroundColor) { this.foreGroundColor = foreGroundColor; return this; } /** * 返回背景色。 * * @return 背景色 */ public Color getBackGroundColor() { return backGroundColor; } /** * 设置背景色。值为十六进制的颜色值(与 CSS 定义颜色的值相同,不支持简写),可以忽略「#」符号。 * * @param backGroundColor * 前景色的值 * * @return QRCode生成器的格式 */ public QRCodeFormat setBackGroundColor(String backGroundColor) { try { this.backGroundColor = getColor(backGroundColor); } catch (NumberFormatException e) { this.backGroundColor = Color.WHITE; } return this; } /** * 设置背景色。 * * @param backGroundColor * 前景色的值 * * @return QRCode生成器的格式 */ public QRCodeFormat setBackGroundColor(Color backGroundColor) { this.backGroundColor = backGroundColor; return this; } /** * 返回图片的文件格式。 * * @return 图片的文件格式 */ public String getImageFormat() { return imageFormat.toUpperCase(); } /** * 设置图片的文件格式 。 * * @param imageFormat * 图片的文件格式 * * @return QRCode生成器的格式 */ public QRCodeFormat setImageFormat(String imageFormat) { this.imageFormat = imageFormat; return this; } /** * 返回图片的外边距大小。 * * @return 图片的外边距大小 */ public int getMargin() { return margin; } /** * 设置图片的外边距大小 。 * * @param margin * 图片的外边距大小 * * @return QRCode生成器的格式 */ public QRCodeFormat setMargin(int margin) { this.margin = margin; return this; } /** * 返回提供给编码器额外的参数。 * * @return 提供给编码器额外的参数 */ public Hashtable<EncodeHintType, ?> getHints() { hints.clear(); hints.put(EncodeHintType.ERROR_CORRECTION, getErrorCorrectionLevel()); hints.put(EncodeHintType.CHARACTER_SET, getEncode()); hints.put(EncodeHintType.MARGIN, getMargin()); return hints; } /** * 返回添加的图片。 * * @return 添加的图片 */ public File getIcon() { return icon; } /** * 设置添加的图片 。 * * @param icon * 添加的图片 * * @return QRCode生成器的格式 */ public QRCodeFormat setIcon(File icon) { this.icon = icon; return this; } /** * 设置添加的图片 。 * * @param iconPath * 添加的图片 * * @return QRCode生成器的格式 */ public QRCodeFormat setIcon(String iconPath) { return setIcon(new File(iconPath)); } private Color getColor(String hexString) { if (hexString.charAt(0) == '#') { return new Color(Long.decode(hexString).intValue()); } else { return new Color(Long.decode("0xFF" + hexString).intValue()); } } }
第三步 使用生成器对象按照指定格式进行生成读取二维码
import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.color.ColorSpace; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.nio.charset.Charset; import javax.imageio.ImageIO; import com.google.zxing.BarcodeFormat; import com.google.zxing.BinaryBitmap; import com.google.zxing.ChecksumException; import com.google.zxing.FormatException; import com.google.zxing.LuminanceSource; import com.google.zxing.NotFoundException; import com.google.zxing.Result; import com.google.zxing.WriterException; import com.google.zxing.client.j2se.BufferedImageLuminanceSource; import com.google.zxing.common.BitMatrix; import com.google.zxing.common.HybridBinarizer; import com.google.zxing.qrcode.QRCodeReader; import com.google.zxing.qrcode.QRCodeWriter; /** * QRCode 处理器 * @ClassName: QRCode * @Description: TODO * @author: ai(ahx.show) * @date: 2016年12月18日 下午1:22:50 */ public final class QRCode { /** QRCode 生成器格式 */ private QRCodeFormat format = null; /** 生成的 QRCode 图像对象 */ private BufferedImage qrcodeImage = null; /** 生成的 QRCode 图片文件 */ private File qrcodeFile = null; /** * 返回生成的 QRCode 图像对象 * * @return 生成的 QRCode 图像对象 */ public BufferedImage getQrcodeImage() { return qrcodeImage; } /** * 返回生成的 QRCode 图片文件 * * @return 生成的 QRCode 图片文件 */ public File getQrcodeFile() { return qrcodeFile; } private QRCode() { } /** * 使用带默认值的「QRCode 生成器格式」来创建一个 QRCode 处理器。 * * @param content * 所要生成 QRCode 的内容 * * @return QRCode 处理器 */ public static QRCode NEW(final String content) { return NEW(content, QRCodeFormat.NEW()); } /** * 使用指定的「QRCode 生成器格式」来创建一个 QRCode 处理器。 * * @param content * 所要生成 QRCode 的内容 * @param format * QRCode 生成器格式 * * @return QRCode 处理器 */ public static QRCode NEW(final String content, QRCodeFormat format) { QRCode qrcode = new QRCode(); qrcode.format = format; qrcode.qrcodeImage = toQRCode(content, format); return qrcode; } /** * 把指定的内容生成为一个 QRCode 的图片,之后保存到指定的文件中。 * * @param f * 指定的文件 * * @return QRCode 处理器 */ public QRCode toFile(String f) { return toFile(new File(f), this.format.getIcon()); } /** * 把指定的内容生成为一个 QRCode 的图片,之后保存到指定的文件中。 * * @param qrcodeFile * 指定的文件 * * @return QRCode 处理器 */ public QRCode toFile(File qrcodeFile) { return toFile(qrcodeFile, this.format.getIcon()); } /** * 把指定的内容生成为一个 QRCode 的图片,并在该图片中间添加上指定的图片;之后保存到指定的文件内。 * * @param qrcodeFile * QRCode 图片生成的指定的文件 * @param appendFile * 需要添加的图片。传入的文件路径如果没有(null 或者为空)的时候将忽略该参数 * * @return QRCode 处理器 */ public QRCode toFile(String qrcodeFile, String appendFile) { if (null == appendFile || appendFile.length() == 0) { return toFile(new File(qrcodeFile)); } return toFile(new File(qrcodeFile), new File(appendFile)); } /** * 把指定的内容生成为一个 QRCode 的图片,并在该图片中间添加上指定的图片;之后保存到指定的文件内。 * * @param qrcodeFile * QRCode 图片生成的指定的文件 * @param appendFile * 需要添加的图片。传入的图片不存在的时候将忽略该参数 * * @return QRCode 处理器 */ public QRCode toFile(File qrcodeFile, File appendFile) { try { if (!qrcodeFile.exists()) { qrcodeFile.getParentFile().mkdirs(); qrcodeFile.createNewFile(); } if (null != appendFile && appendFile.isFile() && appendFile.length() != 0) { appendImage(ImageIO.read(appendFile)); } if (!ImageIO.write(this.qrcodeImage, getSuffixName(qrcodeFile), qrcodeFile)) { throw new RuntimeException("Unexpected error writing image"); } } catch (IOException e) { throw new RuntimeException(e); } this.qrcodeFile = qrcodeFile; return this; } private void appendImage(BufferedImage appendImage) { appendImage(this.qrcodeImage, appendImage, this.format); } private static void appendImage(BufferedImage qrcodeImage, BufferedImage appendImage, QRCodeFormat format) { int baseWidth = qrcodeImage.getWidth(); int baseHeight = qrcodeImage.getHeight(); // 计算 icon 的最大边长 // 公式为 二维码面积*错误修正等级*0.4 的开方 int maxWidth = (int) Math.sqrt(baseWidth * baseHeight * format.getErrorCorrectionLevelValue() * 0.4); int maxHeight = maxWidth; // 获取 icon 的实际边长 int roundRectWidth = (maxWidth < appendImage.getWidth()) ? maxWidth : appendImage.getWidth(); int roundRectHeight = (maxHeight < appendImage.getHeight()) ? maxHeight : appendImage.getHeight(); BufferedImage roundRect = new BufferedImage(roundRectWidth, roundRectHeight, BufferedImage.TYPE_INT_ARGB); Graphics2D g2 = roundRect.createGraphics(); g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.setColor(Color.WHITE); g2.fillRoundRect(0, 0, roundRectWidth, roundRectHeight, 27, 27); g2.setComposite(AlphaComposite.SrcAtop); g2.drawImage(appendImage, 0, 0, roundRectWidth, roundRectHeight, null); g2.dispose(); Graphics gc = qrcodeImage.getGraphics(); gc.setColor(format.getBackGroundColor()); gc.drawImage(roundRect, (baseWidth - roundRectWidth) / 2, (baseHeight - roundRectHeight) / 2, null); gc.dispose(); } /** * 使用带默认值的「QRCode 生成器格式」,把指定的内容生成为一个 QRCode 的图像对象。 * * @param content * 所需生成 QRCode 的内容 * * @return QRCode 的图像对象 */ public static BufferedImage toQRCode(String content) { return toQRCode(content, null); } /** * 使用指定的「QRCode生成器格式」,把指定的内容生成为一个 QRCode 的图像对象。 * * @param content * 所需生成 QRCode 的内容 * @param format * QRCode 生成器格式 * @return QRCode 的图像对象 */ public static BufferedImage toQRCode(String content, QRCodeFormat format) { if (format == null) { format = QRCodeFormat.NEW(); } content = new String(content.getBytes(Charset.forName(format.getEncode()))); BitMatrix matrix = null; try { matrix = new QRCodeWriter().encode(content, BarcodeFormat.QR_CODE, format.getSize(), format.getSize(), format.getHints()); } catch (WriterException e) { throw new RuntimeException(e); } int width = matrix.getWidth(); int height = matrix.getHeight(); int fgColor = format.getForeGroundColor().getRGB(); int bgColor = format.getBackGroundColor().getRGB(); BufferedImage image = new BufferedImage(width, height, ColorSpace.TYPE_RGB); for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { image.setRGB(x, y, matrix.get(x, y) ? fgColor : bgColor); } } File appendFile = format.getIcon(); if (null != appendFile && appendFile.isFile() && appendFile.length() != 0) { BufferedImage appendImage = null; try { appendImage = ImageIO.read(appendFile); } catch (IOException e) { throw new RuntimeException(e); } appendImage(image, appendImage, format); } return image; } /** * 从指定的 QRCode 图片文件中解析出其内容。 * * @param qrcodeFile * QRCode 文件 * * @return QRCode 中的内容 */ public static String from(String qrcodeFile) { if (qrcodeFile.startsWith("http://") || qrcodeFile.startsWith("https://")) { try { return from(new URL(qrcodeFile)); } catch (MalformedURLException e) { throw new RuntimeException(e); } } else { return from(new File(qrcodeFile)); } } /** * 从指定的 QRCode 图片文件中解析出其内容。 * * @param qrcodeFile * QRCode 图片文件 * * @return QRCode 中的内容 */ public static String from(File qrcodeFile) { try { BufferedImage image = ImageIO.read(qrcodeFile); return from(image); } catch (IOException e) { throw new RuntimeException(e); } } /** * 从指定的 QRCode 图片链接中解析出其内容。 * * @param qrcodeUrl * QRCode 图片链接 * * @return QRCode 中的内容 */ public static String from(URL qrcodeUrl) { try { BufferedImage image = ImageIO.read(qrcodeUrl); return from(image); } catch (IOException e) { throw new RuntimeException(e); } } /** * 从指定的 QRCode 图像对象中解析出其内容。 * * @param qrcodeImage * QRCode 图像对象 * * @return QRCode 中的内容 */ public static String from(BufferedImage qrcodeImage) { LuminanceSource source = new BufferedImageLuminanceSource(qrcodeImage); BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); String content = null; try { Result result = new QRCodeReader().decode(bitmap); content = result.getText(); } catch (NotFoundException e) { throw new RuntimeException(e); } catch (ChecksumException e) { throw new RuntimeException(e); } catch (FormatException e) { throw new RuntimeException(e); } return content; } private String getSuffixName(File file) { String path = file.getAbsolutePath(); if (null == path) { return this.format.getImageFormat(); } int pos = path.lastIndexOf('.'); if (-1 == pos) { return this.format.getImageFormat(); } return path.substring(pos + 1).toUpperCase(); } public static void main(String[] args) throws IOException { String str="https://blog.csdn.net/jiandanyou/article/details/109751418"; QRCode.NEW(str).toFile("d:\\2.jpg");//使用指定字符串生成二维码 System.out.println(QRCode.from("d:/2.jpg"));//读取解析指定二维码 } }
第四步 使用
工具类中的方法使用的静态方法,可以直接使用QRCode.方法进行执行
生成二维码方法
QRCode.NEW(str).toFile(url);
str:二维码中包含的字符串(如果包含地址前缀添加http或https 否则不能自动跳转 会解析地址字符串)
url:二维码图片生成位置
QRCode.from(url);
url:要解析二维码图片位置
看完上述内容,你们对在java项目中使用jar包怎么实现一个二维码生成功能有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。