因行動裝置的流行而跟著帶動起來的QR Code,是眾多條碼類型的其中一種,它讓我們的生活更便利,傳遞資訊的速度更快,省下許多使用鍵盤打字的時間。如果要產生出QR Code,已經有許多相關的現成工具能夠使用,甚至還能直接在網頁上產生。只是有的時候還是會遇到需要在自己的程式中加入產生QR Code的狀況,像是需要產生大量的QR Code時,或是想要讓自己的程式能不依賴其他工具就能獨立使用。這篇文章,將會探討如何使用Rust程式語言產生QR Code。



QR Code Generator

「QR Code Generator」是筆者開發的套件,採用「nayuki/QR-Code-generator」這個跨程式語言的QR Code產生函式庫來產生QR Code的資料矩陣,並支援RAW、SVG、PNG格式的圖檔輸出。

Crates.io

https://crates.io/crates/qrcode-generator

Cargo.toml

qrcode-generator = "*"

使用方法

「qrcode_generator」提供了幾個有用的函數,可以進行QR Code編碼。帶有「by_segments」結尾的函數名稱,屬於低階的使用方法,可以最佳化產生出來的QR Code資料。

另外還可以使用「QrCodeEcc」列舉來控制QR Code資料的錯誤修正等級,其「Low」變體可以修正7%內的錯誤;「Medium」變體可以修正15%內的錯誤;「Quartile」變體可以修正25%內的錯誤;「High」變體可以修正30%內的錯誤。錯誤修正的等級愈高,編碼出來的資料量就會愈多,通常會因此使得QR Code的尺寸版本上升(白話一點來說就是QR Code的點數會變多),但是尺寸版本也有可能在錯誤修正等級的提升之下維持不變,因為資料量剛好沒超過尺寸版本的容納上限。程式設計師在使用這個套件時所指定的錯誤修正等級,這個套件會自動去選擇相同尺寸版本中「最佳」的錯誤修正等級,比如說我們想要用「QrCodeEcc::Medium」來編碼某個資料,但是這筆資料在使用「QrCodeEcc::High」編碼出來的QR Code尺寸版本和使用「QrCodeEcc::Medium」編碼QR Code尺寸版本是相同的話,這個套件就會選擇使用「QrCodeEcc::High」來作為真正的錯誤修正等級。

to_image

「to_image」函數可以將任意資料編碼成8位元灰階色域的圖片原始(RAW)資料,方便進行後續的影像處理。原則上輸出的資料型別為「Vec<u8>」,但也可以在「to_image」名稱後加上「_buffer」,來將資料以「ImageBuffer<Luma<u8>, Vec<u8>>」型別輸出。

程式如下:

extern crate qrcode_generator;

use qrcode_generator::QrCodeEcc;

let result: Vec<u8> = qrcode_generator::to_image("Hello world!", QrCodeEcc::Low, 1024).unwrap();

println!("{:?}", result);
to_matrix

「to_matrix」函數可以將任意資料編碼成「Vec<Vec<bool>>」型別的QR Code二維陣列,方便進行後續的處理。

程式如下:

extern crate qrcode_generator;

use qrcode_generator::QrCodeEcc;

let result: Vec<Vec<bool>> = qrcode_generator::to_matrix("Hello world!", QrCodeEcc::Low).unwrap();

println!("{:?}", result);
to_png

「to_png」函數可以將任意資料編碼成PNG圖片,寫進任意的Writer中。在「to_png」函數名稱後加上「_to_vec」可以將PNG圖片資料以「Vec<u8>」型別來輸出;加上「_to_file」可以將PNG圖片資料輸出成檔案。

程式如下:

extern crate qrcode_generator;

use qrcode_generator::QrCodeEcc;

qrcode_generator::to_png_to_file("Hello world!", QrCodeEcc::Low, 1024, "path/to/file.png").unwrap();
to_svg

「to_svg」函數可以將任意資料編碼成SVG圖片,寫進任意的Writer中。在「to_svg」函數名稱後加上「_to_string」可以將SVG圖片資料以「String」型別來輸出;加上「_to_file」可以將SVG圖片資料輸出成檔案。

程式如下:

extern crate qrcode_generator;

use qrcode_generator::QrCodeEcc;

qrcode_generator::to_svg_to_file("Hello world!", QrCodeEcc::Low, 1024, None, "path/to/file.svg").unwrap();