erwanvivien / fast_qr Goto Github PK
View Code? Open in Web Editor NEWUltra fast QRCode generation
Home Page: https://fast-qr.com/
License: MIT License
Ultra fast QRCode generation
Home Page: https://fast-qr.com/
License: MIT License
In my project miniserve, I get errors from inside fast_qr
since upgrading to 0.8.3: https://github.com/svenstaro/miniserve/actions/runs/4175872918/jobs/7231388083
I believe this is a bug recently introduced in fast_qr itself.
This is a nice library, and fast too (I ran my own benchmarks as well) :) Sadly I cannot use it for work due to its AGPL license.
You probably know that AGPL requires modified code to be shared with the public and remain under the AGPL license. Also any code linked to the GPL/AGPL code (either dynamically or statically) is considered a combined work and the entire combination must be licensed under GPL/AGPL. So the code I write for work would also have to be open sourced as GPL/AGPL.
Sadly my employer won't want to share the rest of our codebase that might use this library.
I'm developing a project that is compiled to wasm (cloudflare worker) and needs to generate qr codes with custom visual processing when converting to an image. I've completed the processing using the command shape variant, but now I need to use it in wasm.
Why is it disabled for wasm? I don't think there are any issues preventing it being enabled, as it's just a function pretty much.
An explanation would be appreciated, or a patch to remove the disabling on wasm arch.
I can see to_file
but in my case I will need byte
as a http response from_byte
for a return but can't find anyway to do it.
Hey, just wanna know if there is wayt to brand the QR code generated, like colors and logo.
At the moment fast_qr (javascript/wasm interface) always uses the default error code level (ecl) of Q (25%). It would be desirable if this can be configured through SVGOptions.
e.g.
const options = new SvgOptions()
.ecl(ECL.Q);
Remove most Option to use panic instead
Would be nice if this library also worked in NodeJS, since there are no functioning qrcode generation libraries with high performance for NodeJS right now
First of all, great crate, I'm using it in a Discord bot.
Discord has 2 themes, dark and light. I would want to use a module color that fits both dark and light, but in order to do that, I need transparent backgrounds.
In your opinion, how hard would that be to make? I looked into the SVG this crate worked with, but didn't see any transparency options at first glance.
If in your opinion it shouldn't be so hard, I might want to take a stab at it :)
This crate, as of the time of writing, only has a single dependency (wasm-bindgen) which is great! But I wonder whether even this dependency could be made optional for those of us who don't need wasm-bindgen.
Hey! Big fan of the library, though I came across a strange issue the other day.
Seems as though the QR codes are rendered with a diagonal inversion for image/svg output.
This can be verified by looking at the format information (as per ISO/IEC 18004 2015), specifically the first two error correction bits and their placement.
This diagram from Wikipedia summarizes the expectations of the format sequence.
https://en.wikipedia.org/wiki/File:QR_Format_Information.svg
I used this snippet to create the QRCode
for the following tests:
let qrcode = QRBuilder::new("Test")
.ecl(ECL::M)
.version(Version::V01)
.build()
.unwrap();
With an ECL::M
, we expect to see the ECL sequence of [1,0]
.
In the following images, the red and blue borders highlight the format sequences, with the green highlighting the ECL sequence.
When printing to our terminal, we see the format sequences aligned correctly:
However, when rendering an SVG or PNG, we notice the diagonal inversion, causing inversion of the format sequences:
Note that the rest of the QR code is also diagonally inverted.
Benchmarking fails in ubuntu with below error:
vscode ➜ /workspaces/fast_qr (master) $ /bin/python3.11 /workspaces/fast_qr/benches/bench.py
| Benchmark | Lower | Estimate | Upper | |
|:------------------------ |:---------:|:---------:|:---------:| ------------------------ |
Traceback (most recent call last):
File "/workspaces/fast_qr/benches/bench.py", line 90, in <module>
f"| {test2:<24} | {data2[0]:<9} | {data2[1]:<9} | {data2[2]:<9} |",
~~~~~^^^
IndexError: list index out of range
After debugging found that microsecond is represented as u
instead of unicode char µ
. This is not helping to extract microseconds value from the output of criterion benchmark.
Thank you for your work!
I want to replace qrcode
with your crate, Is it possible to implement like this for supports both dark and light colored terminals
let code = QrCode::new("mow mow").unwrap();
let image = code.render::<unicode::Dense1x2>()
.dark_color(unicode::Dense1x2::Light)
.light_color(unicode::Dense1x2::Dark)
.build();
println!("{}", image);
fast_qr::convert::image
could not find image
in convert
[dependencies]
pyo3 = { version = "0.17.3", features = ["extension-module"] }
fast_qr="0.6.1"
High. I was trying to generate a QR as a PNG to I could integrate it into a an tag on a webassembly module I' building but every single time in generates a garbled image. I don't know what step I'm missing to do over the produced [u8] so align the data of if it is in reality an issue with a dependency.
The shortest example I can provide is:
Cargo.toml
[package]
name = "foo"
version = "0.1.0"
authors = ["Rust Example <[email protected]>"]
[dependencies]
fast_qr = { version = "0.8.4", features = ["image"] }
base64 = "0.21.0"
main.rs
use fast_qr::{
convert::{image::ImageBuilder, Builder},
QRBuilder, Version, ECL,
};
fn main() {
let qrcode = match QRBuilder::new("datos de prueba para salir".to_string().as_bytes())
.ecl(ECL::H)
.version(Version::V40)
.build() {
Ok(qr) => qr,
Err(why) => {
panic!("Failed generating Qr Code: {why:?}");
}
};
let pixmap = ImageBuilder::default()
.background_color([255, 255, 255, 0]) // transparency
.to_pixmap(&qrcode);
let Ok(url_encoded_data) = pixmap.encode_png().map(|x| base64::encode(&x[..]) ) else {
panic!("could not base64 encode generated QR from string '");
};
let src = format!("data:image/png;base64,{url_encoded_data}");
println!("{src}");
}
The print at the end produces the URL encoded data that is supposed to be used on the tag
data:image/png;base64,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
The image can be downloaded from here : https://ibb.co/Y3n4q5T
I'll appreciate any guidance on the topic
According to the Cargo book
If you’re building a non-end product, such as a rust library that other rust packages will depend on, put
Cargo.lock
in your.gitignore
.
I came across an issue while upgrading to 0.8.0
because I also required png = "0.17.7"
while fast_qr
lists png = "0.17.6"
.
In my case it doesn't matter but this could cause future annoyance (or actual issues) to someone else. Perhaps we should remove main.rs
and put the contained code into an examples
directory (which you can run easily with cargo).
I could make a pr for this if you agree sometime soon-ish :)
For use via wasmi, wasm-bindgen is a problem, would you consider putting it behind a feature? If it's straightforward I could probably even find time to create a PR if you're interested, I have a temporary fix in my fork here
It would be nice if std::error::Error
is implemented for QRCodeError
struct. It will be easy for error handling.
It would be nice if the SvgOptions class adds an optional 'title' property. If set, the title would then be added as a child of the rect element:
<rect ... fill="#ffffff">
<title>title</title>
</rect>
The title will be shown as a tooltip when the mouse hovers over the element. See:
https://developer.mozilla.org/en-US/docs/Web/SVG/Element/title
demo:
https://stackoverflow.com/questions/10643426/how-to-add-a-tooltip-to-an-svg-graphic
Lines 31 to 37 in 11fc725
Is this paragraph for beauty? Because I think the following code should be faster
// Prints top margin without background
println!("{}", BOTTOM.to_string().repeat(qr.size + 2));
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.