二维码工具-QrCodeUtil

由来
由于大家对二维码的需求较多,对于二维码的生成和解析我认为应该作为简单的工具存在于Hutool中。考虑到自行实现的难度,因此Hutool针对被广泛接受的的zxing库进行封装。而由于涉及第三方包,因此归类到extra模块中。

使用
引入zxing
考虑到Hutool的非强制依赖性,因此zxing需要用户自行引入:

<dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>core</artifactId>
    <version>3.3.3</version>
</dependency>

生成二维码

在此我们将Hutool主页的url生成为二维码,微信扫一扫可以看到H5主页哦:

// 生成指定url对应的二维码到文件,宽和高都是300像素
QrCodeUtil.generate("https://hutool.cn/", 300, 300, FileUtil.file("d:/qrcode.jpg"));

效果qrcode.jpg:

自定义参数(since 4.1.2)

  1. 基本参数设定

通过QrConfig可以自定义二维码的生成参数,例如长、宽、二维码的颜色、背景颜色、边距等参数,使用方法如下:

QrConfig config = new QrConfig(300, 300);
// 设置边距,既二维码和背景之间的边距
config.setMargin(3);
// 设置前景色,既二维码颜色(青色)
config.setForeColor(Color.CYAN.getRGB());
// 设置背景色(灰色)
config.setBackColor(Color.GRAY.getRGB());
 
// 生成二维码到文件,也可以到流
QrCodeUtil.generate("http://hutool.cn/", config, FileUtil.file("e:/qrcode.jpg"));
  1. 附带logo小图标
QrCodeUtil.generate(//
    "http://hutool.cn/", //二维码内容
    QrConfig.create().setImg("e:/logo_small.jpg"), //附带logo
    FileUtil.file("e:/qrcodeWithLogo.jpg")//写出到的文件
);

调整纠错级别
很多时候,二维码无法识别,这时就要调整纠错级别。纠错级别使用zxing的ErrorCorrectionLevel枚举封装,包括:L、M、Q、H几个参数,由低到高。低级别的像素块更大,可以远距离识别,但是遮挡就会造成无法识别。高级别则相反,像素块小,允许遮挡一定范围,但是像素块更密集。
 

QrConfig config = new QrConfig();
// 高纠错级别
config.setErrorCorrection(ErrorCorrectionLevel.H);
QrCodeUtil.generate("https://hutool.cn/", config, FileUtil.file("e:/qrcodeCustom.jpg"));

识别二维码

// decode -> "http://hutool.cn/"
String decode = QrCodeUtil.decode(FileUtil.file("d:/qrcode.jpg"));

实例:

controller层:

 /**
     * 生成二维码(输出图片流)
     *                 
     *
     * @param content  生成的路径
     * @param width     宽
     * @param height    长
     * @return
     */
    @ApiOperation(value="生成二维码", notes = "")
    @PostMapping(value = CIIPCommonConstant.ApiAuth.ANON + "/QRCode")
    public ResponseMessage QRCode(String content, int width, int height){
        return ciipUserService.QRCode(content,width,height);
    }

service层:

    /**
     *  生成二维码(输出图片流)
     *             
     *
     * @param content  生成的路径
     * @param width     宽
     * @param height    长
     * @return
     */
    ResponseMessage QRCode(String content, int width, int height);

service实现层:

    /**
     *  生成二维码(输出图片流)
     *            
     *
     * @param content  生成的路径
     * @param width     宽
     * @param height    长
     * @return
     */
    @Override
    public ResponseMessage QRCode(String content, int width, int height) {
 
        BufferedImage bufferedImage;
        if(width==0 || height == 0){
            bufferedImage = QrCodeUtil.generate(content, 300, 300);
        }else{
            bufferedImage = QrCodeUtil.generate(content, width, height);
        }
        return ResultUtil.success(bufferedImage,UserCenterStatusCode.CIIP_QRCODE_SUCCESS.getCode(),UserCenterStatusCode.CIIP_QRCODE_SUCCESS.getMsg());
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
非常抱歉,我之前给出的示例中有误。C++版的ZXing库中没有名为 `HybridBinarizer` 的命名空间 `zxing` 成员。请忽略我之前的回答。 在C++版的ZXing库中,要使用混合二值化(Hybrid Binarization)算法,你可以使用 `zxing::GlobalHistogramBinarizer` 类来替代。下面是一个修正后的示例: ```cpp #include <iostream> #include <zxing/DecodeHints.h> #include <zxing/MultiFormatReader.h> #include <zxing/Result.h> #include <zxing/BinaryBitmap.h> #include <zxing/common/GlobalHistogramBinarizer.h> int main() { // 加载图像 zxing::Ref<zxing::LuminanceSource> source = zxing::FileLuminanceSource::create("path/to/your/image.jpg"); zxing::Ref<zxing::Binarizer> binarizer = zxing::Ref<zxing::Binarizer>(new zxing::GlobalHistogramBinarizer(source)); zxing::Ref<zxing::BinaryBitmap> bitmap = zxing::Ref<zxing::BinaryBitmap>(new zxing::BinaryBitmap(binarizer)); // 设置解码提示 zxing::DecodeHints hints; hints.setTryHarder(true); // 解码二维码 zxing::MultiFormatReader reader; zxing::Ref<zxing::Result> result = reader.decode(bitmap, hints); // 提取解码结果 std::string decodedData = result->getText()->getText(); std::cout << "Decoded data: " << decodedData << std::endl; return 0; } ``` 这个修正后的示例使用了 `zxing::GlobalHistogramBinarizer` 来进行图像的二值化处理,替代了之前错误的 `HybridBinarizer`。 请确保你已正确安装了ZXing库,并将其包含路径添加到你的项目配置中,以便编译器能够找到正确的头文件和库文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值