最近工作上剛好有需要產製大量的QR Code,雖然在ruby環境下已經有成熟的套件可以做到,但因為需要的量很多,效能有點差強人意
使用需求是要能產生指定大小的黑白純色 QR Code png,研究後覺得情境夠簡單,自己寫一個ruby native extension應該沒問題,就朝這個方向進行
我的gem要做到事情只有一項:依照QR Code布局去產生對應尺寸的圖片
為求精簡和高效能,用了 nayuki的qrcodegen 和 randy408的libspng,他們都是不需要任何外部相依套件就能運作的library,授權條款也很寬鬆
從qrcodegen拿到QR Code矩陣後,根據QR Code原始大小和最終指定的圖片大小計算放大倍率,把矩陣放大成指定大小並輸出成png
概念上不難,複雜在如何以高效率的方式進行(而且要小心offset error),我前後試了好幾個版本的作法,最終把速度提升到純ruby實作的100倍快
只是這種精簡到極致的做法也不是完全沒有缺點,我的實作最終會輸出非黑即白的1-bit png,雖然使用需求要能夠處理任意大小,但在非整數倍的放大下,會出現一定程度的失真
例如以原始尺寸31放大成34,多的3px還真的不知道應該要放31中的哪些資料比較好,這會導致圖片嚴重變形無法辨識
如果以原始尺寸31放大成340來看,這時可以利用的點變多了,雖然不是完美等比例放大,在視覺上幾乎看不出有什麼失真,掃描也都正常
只要把尺寸調大就能改善,對一個以效能為前提的gem來說並不構成大問題
有興趣歡迎到我的Repo看看:https://github.com/atitan/cheetah_qrcode
留言