npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

pqrs-js

v1.2.0

Published

Portable QR code scanning library (JS version using wasm/asm.js)

Downloads

4

Readme

Pipeline status Version Downloads/week License

pqrs

A Portable QR Scanning library. Image processing is very much based on algorithms used in BoofCV. Decoding and error correction is based on zxing

Requires C++17 compiler. Seems to work with GCC and Clang

Compiles as native code and as webassembly code for browser usage using emscripten

Demo

Demo is available here

Using in js projects

There is an npm package

It will work out-of-the box in nodejs and will probably require special handling for webassembly file distribution in browser.

You can see pqrs-cli for example usage.

Long and sad story as to why this was created

I needed a QR scanning library in web application. So, I went with jsQR, which is one of zxing ports to js. What could go wrong? Apparently, a lot.

The scanner was used to scan an image projected to screen in intensively lit big auditorium. Users were to scan it without leaving their places. And this actually posed a challenge...

I have distinguished two conditions that pose a challenge to zxing:

First of them is low projector image contrast, which is an inherent problem of all projectors. They cannot make "black" any darker than ambient lighting, so the only way to increase contrast is increasing light output, which is limited.

This affects the stage of QR code detection. Most scanners begin with image binarization and then try to detect finder patterns. Low contrast is quite a challenge for most binarization algorithms and, for no surprise, zxing struggled with it.

The second problem was due to the fact that auditorium was quite big and users were to scan QR without leaving their seats. This required scanning from quite large angles: up to 70 degrees from normal to the screen. zxing does not handle huge perspective distortions caused by this quite well.

Then I surveyed already existing QR scanners to find those reasonably handling my problematic cases.

That's when I found BoofCV, which boasted surprising performance in my cases. And apparently, it was actually pretty good =). There was only one problem: it's written in Java, which is not straightforward to run in browser context.

So, I've decided to write a C++ port(-ish) of BoofCV QR scanner and compile it to webassembly using emscripten.

From this I got, on one hand, an ability to use it in much more languages than BoofCV (C++, arguably, has interoperability rate comparable to that of C) and performance (wasm is quite close to what you can get in native code).

It is not a direct port, some corners were cut (where it seemed like it would not affect performance or scanning quality), some features were added (like local thresholding when sampling QR code modules, which handled the uneven lighting).