二维条形码比普通的条形码能保存更多的信息,已经应用到很多领域里面。例如手机电影票,就是一个嵌在彩信里面的二维码图像。南航也推出了网上办理登机牌业务,办理完成之后往手机发送一条包含二维码的彩信,到了机场就可以通过自助设备扫描二维码,打印登机牌。
然而,专业的二维码扫描设备价格十分昂贵,最便宜的都在1000元以上,到淘宝上搜搜就知道了。借助Java和一个开源的库,我们却可以通过普通的网络摄像头实现相同的效果,成本只需要几十块。
Open Source QR Code Library是一个开源的QR Code(二维条形码的一种)生成和读取的库,官方网站为:http://qrcode.sourceforge.jp/,里面包含了生成和读取QR Code的所有代码,其中有个jmfexample就能实现通过摄像头读取QR Code,经过本人尝试,几十块的普通摄像头效果已经不错了,一次读取几百字节都没问题。
使用这个库的步骤如下:
1、到其官方网站下载回来;
2、到sun的网站下载JMF包并安装;
3、插上摄像头,打开我的电脑,查看是否出现“USB视频设备”,然后打开,看摄像头工作是否正常
4、运行JMF里面的JMF Registry程序,点击“Detect Capture Devices”,查找视频设备,查找到之后会在左边的列表里出现“vfw:Microsoft WDM Image Capture (Win32):0”类似的设备,点击就会在右边出现其详细信息,我的摄像头是这样的:
Name = vfw:Microsoft WDM Image Capture (Win32):0
Locator = vfw://0
Output Formats---->
0. javax.media.format.YUVFormat
YUV Video Format: Size = java.awt.Dimension[width=640,height=480] MaxDataLength = 614400 DataType = class [B yuvType = 32 StrideY = 1280 StrideUV = 1280 OffsetY = 0 OffsetU = 1 OffsetV = 3
1. javax.media.format.YUVFormat
YUV Video Format: Size = java.awt.Dimension[width=160,height=120] MaxDataLength = 38400 DataType = class [B yuvType = 32 StrideY = 320 StrideUV = 320 OffsetY = 0 OffsetU = 1 OffsetV = 3
2. javax.media.format.YUVFormat
YUV Video Format: Size = java.awt.Dimension[width=176,height=144] MaxDataLength = 50688 DataType = class [B yuvType = 32 StrideY = 352 StrideUV = 352 OffsetY = 0 OffsetU = 1 OffsetV = 3
3. javax.media.format.YUVFormat
YUV Video Format: Size = java.awt.Dimension[width=320,height=240] MaxDataLength = 153600 DataType = class [B yuvType = 32 StrideY = 640 StrideUV = 640 OffsetY = 0 OffsetU = 1 OffsetV = 3
4. javax.media.format.YUVFormat
YUV Video Format: Size = java.awt.Dimension[width=352,height=288] MaxDataLength = 202752 DataType = class [B yuvType = 32 StrideY = 704 StrideUV = 704 OffsetY = 0 OffsetU = 1 OffsetV = 3
注意,其中Output Formats都是javax.media.format.YUVFormat,而QR Code Library里默认的设备不是这种格式的,所以需要对源码作一定的修改。
5、用Eclipse打开QR Code Library的源码,作出一些适当的修改:
如果摄像头是上面所说的只支持YUV格式,则需要修改jp.sourceforge.qrcode.example.jmf.camDataSource.java,把setMainSource函数里的
VideoFormat vidformat = new VideoFormat(VideoFormat.RGB);
修改为
VideoFormat vidformat = new VideoFormat(VideoFormat.YUV);
否则永远也找不到摄像头。
6、把JMF包里的jmf.jar放到Classpath里
7、执行jp.sourceforge.qrcode.example.jmf.jmfexample,搞定
当然,由于源码开放的,只要符合许可,你想怎么改都行,可以把它嵌入到某个应用程序里面,这个程序就具有了扫描QR Code的功能了。