9sharp / qrcoder

Encode image with QR code.
MIT License
1 stars 0 forks source link

RGB三通道二维码编码方案设计讨论 #3

Open hszcg opened 10 years ago

hszcg commented 10 years ago

@mrroach9 @kaicheng @ccding

0. 基本流程 Image <-> Compressed Image Data <-> String/Number/Byte <-> QR Image

1. 原始图像的压缩方案,最简单的可以使用JPEG,其次可以使用WebP JPEG的好处是可以直接用canvas直接压缩,速度快,格式通用

我现在实现的方案,20的JPEG quality,QR version 8, error level M,参考http://www.qrcode.com/en/about/version.html

WebP的好处是直接可以指定压缩比,而且根据评测,同等压缩比的状态下一般视觉效果会比JPEG要好 建议可以先采用JPEG做实验

2. 参考普通二维码的工业标准 http://coolshell.cn/articles/10590.html 二维码可以采用数字、字符和字节编码 字符编码需要先将图像转化为string,对于JPEG格式来说,canvas可以直接支持转化为Base64的String (也就是我现在实现的方案),然后就可以了 数字或者字节编码可以直接按照图像压缩后的数字或者字节来存储,这个相对麻烦一点,要研究如何保存JPEG或者WebP的metadata;但是好处在于压缩比应该会比字符编码效率高一点(参考存储量http://en.wikipedia.org/wiki/QR_code#Storage)

似乎存储能力 iQR Code > microQR Code > QR Code,但是问题是iQR暂时受专利保护,microQR的实现不多 iQR Code http://www.qrcode.com/en/codes/iqr.html#iQrCapacityH2Title microQR Code http://www.qrcode.com/en/codes/microqr.html

3. 彩色二维码的方案设计 最简单的方法是直接把数据均分成三份,RGB通道各一份来存储 对每一个通道来说,都遵循普通二维码的标准,确保对齐信息重合即可(存储量是原来的三倍) 这部分与采用某一种编码方式(数字、字符和字节)几乎没有依赖,直接实现即可 彩色二维码的编码、解码器也需要我们自己实现,这部分的工作量可能不小

4. 此外,可能还需要考虑加密的方法,这部分我不太了解,待补充

edwardtoday commented 10 years ago

二维码这种色块图,PNG可能压出来更小,且无损。 比如这个issue页面link的二维码,300x300,png用256色palette可以自动认出其实是1bit的颜色,然后压到632 bytes: exported_qrcode_image 而JPEG用20%质量,chroma subsampling开到 4:1:1(这个对单色图影响极小),也要10KB: exported_qrcode_image 相比之下,webp倒是聪明,quality=100的结果是742 bytes,github comment不支持上传webp图片,反正我肉眼看不出跟png有啥差别,JPEG画质弱爆了。

hszcg commented 10 years ago

@edwardtoday 额……其实二维码是不需要压缩的……

基本流程是 Image <-> Compressed Image Data <-> String/Number/Byte <-> QR Image

需要压缩的只是原始的图像……

edwardtoday commented 10 years ago

那还是JPEG简单粗暴

ccding commented 10 years ago

那个二维码自己写压缩算法的话是不是只需要 30*30=900 bit=113 byte?