11个不稳定版本 (4个破坏性版本)

0.5.0 2023年7月29日
0.4.1 2023年3月11日
0.4.0 2022年11月27日
0.3.0 2021年11月3日
0.1.1 2019年5月4日

#144 in 图像

Download history 155/week @ 2024-04-15 740/week @ 2024-04-22 446/week @ 2024-04-29 86/week @ 2024-05-06 327/week @ 2024-05-13 85/week @ 2024-05-20 53/week @ 2024-05-27 71/week @ 2024-06-03 72/week @ 2024-06-10 64/week @ 2024-06-17 57/week @ 2024-06-24 24/week @ 2024-07-01 59/week @ 2024-07-08 80/week @ 2024-07-15 81/week @ 2024-07-22 104/week @ 2024-07-29

每月324次 下载
用于 6 crate

MIT 许可证

130KB
3K SLoC

Bardecoder

用100% Rust编写的检测和解码QR码

Github Actions License Crates.io docs.rs Rustc version

背景

这个库是在查看Not Yet Awesome Rust列表后出现的。它力求模块化,以便可以相互替换具有不同强度、速度和鲁棒性的算法。

如何使用

将以下内容添加到您的Cargo.toml

[dependencies]
bardecoder = "0.5"
image = "0.24"

快速

最快的方式是使用内置的默认解码器。这在绝大多数情况下都会工作,但请注意以下提示

fn main() {
    let img = image::open("<<image location>>").unwrap();

    // Use default decoder
    let decoder = bardecoder::default_decoder();

    let results = decoder.decode(&img);
    for result in results {
        println!("{}", result.unwrap());
    }
}

修改

如果您想有一些自定义性,可以从默认构建器开始。它将预先填充默认组件,但您可以将任何组件替换为修改后的参数。

use bardecoder;
use bardecoder::prepare::BlockedMean;

use image;

fn main() {
    let img = image::open("<<image location>>").unwrap();

    // Use default decoder builder
    let mut db = bardecoder::default_builder();

    // Use some different arguments in one of the default components
    db.prepare(Box::new(BlockedMean::new(7, 9)));

    // Build the actual decoder
    let decoder = db.build();

    let results = decoder.decode(&img);
    for result in results {
        println!("{}", result.unwrap());
    }
}

您也可以从一个完全空的构建器开始,但请注意,如果任何组件缺失,build()函数将Panic!

use bardecoder::DecoderBuilder;

let mut decoder_builder = DecoderBuilder::new();

高级

如果您想彻底疯狂,您还可以为各种组件提供自己的实现。自行承担风险!

use bardecoder;
use bardecoder::prepare::BlockedMean;
use bardecoder::detect::{Detect, Location};

use image;
use image::GrayImage;

struct MyDetector {}

impl MyDetector {
    pub fn new() -> MyDetector {
        MyDetector {}
    }
}

impl Detect<GrayImage> for MyDetector {
    fn detect(&self, prepared: &GrayImage) -> Vec<Location> {
        vec![]
    }
}

fn main() {
    let img = image::open("<<image location>>").unwrap();

    // Use default decoder builder
    let mut db = bardecoder::default_builder();

    // Use some different arguments in one of the default components
    db.prepare(Box::new(BlockedMean::new(7, 9)));

    // Use your homemade Detector!
    db.detect(Box::new(MyDetector::new()));

    // Build the actual decoder
    let decoder = db.build();

    let results = decoder.decode(&img);
    for result in results {
        println!("{}", result.unwrap());
    }
}

提示

尽管这个库可以处理各种QR图像,但以下是一些优化结果的小提示

  • 保持源图像的分辨率低一些,比如在400x300到800x600像素之间。任何更高的分辨率,检测代码都会相当耗时。
  • 保持QR码居中并放大。
  • 保持QR码无错误,无论是故意的还是偶然的。虽然QR码具有自纠正功能,但实际纠正并不便宜。然而,在开始这个过程之前,很容易检测到QR码是无错误的,因此在这种情况下会提前退出。

功能

Bardecoder公开以下功能,以便在项目中使用

  • debug-images : 一些默认组件将在 <tmp>/bardecoder-debug-images 文件夹中输出调试图像,其中 <tmp> 是默认的操作系统临时文件夹。这可以帮助直观地了解算法正在做什么。请注意,某些组件(例如 QRExtractor)会输出大量的图像,所以请务必不要使用这个功能,除非想查看出错时发生了什么。

  • fail-on-warnings : 虽然其主要用途是针对 travis-ci,但如果您喜欢这样的功能。

支持

如果您发现这个库无法解码的带有二维码的图像,请提出一个 问题。请包括图像和您尝试解码的代码(特别是当使用 修改 方法时)。我会尽力改进算法,但不能保证100%成功,尤其是对于更复杂的二维码。

贡献

如果您发现了一个小错误并能自己修复,请随时提交一个 pull request。对于更大的重构和更根本的问题,请提交一个 工单,概述问题和潜在解决方案。

依赖项

~6MB
~83K SLoC