概述
条码解析在现在市场上有很多的产品,且在各类商场也随处可见其应用的踪影,如超市的收银处。条码枪跟条码数据采集器也是比较常见的。不过这些硬件都需要专门的采购,像一般的人开发人员或普通用户而言,很少接触这些硬件,对其工作原理也是不得而知。
前段时间一朋友购买了一台G4的手机,并且为其装上了一个通过手机摄像头对条码拍照后自动解析出条码信息的软件,我觉得这功能挺不错,相当的实用。比如想查询某商品在网上的相关信息,如果这个商品有条码的话,那可以通过这个功能直接解析出商品的基本信息,再通过google或其他的搜索工具在网上一搜就可以。还有比如对那些二维码的条码,通过手机就可以知道其具体的一些信息,比如实名的火车票。
这么方便的工具,那如果我的手机不支持安装这类应用程序呢,但我有自己的个人电脑可用,那能否在个人电脑上跑一个类似的程序也能完成这样的任务呢?当然,这些在电脑上就更加方便实现了。
接下来我就贴出前段时间实现的一个这样的应用程序,供大家参考。
解说bcvp
在介绍这个应用之前,我们需要了解一下com.google.zxing这个开源项目,ZXing(发音类似Zebra
crossing)是Java的开源多格式1D/2D条码图像处理库,目的是使用内置在手机上的摄像头拍照并对条码进行解码,而不必与服务器通讯,它被用于Android系统。但同样可以应用J2SE、J2EE等领域。项目地址:http://code.google.com/p/zxing/。这项目的使用相当的简单,将zxing的core.jar跟javase.jar两个包添加到项目的Libraries下面就行,其调用也相当的简单,如下面根据图片解码的方法:
/**
* 获取解码后的文本内容
* @param image 用来解析的图片对象
* @return
*/
public static String getDecodeText(BufferedImage image) {
if (image == null) {
return null;
}
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(
new BufferedImageLuminanceSource(image)));
Result result;
try {
result = mfr.decode(bitmap);
} catch (ReaderException re) {
return re.getMessage();
}
return result.getText();
}
如果项目中有用到Maven的话,则只需要在项目的pom.xml文件中加入其依赖就可,但因为这个项目在
Maven2的公共仓库中没有,因此需要下载其源码到本地运行Maven的相关命令编译安装到本地Maven仓库或者作业环境的公共Maven仓库。下面是我这个程序的项目结构:
其中除了用到ZXing这个项目会,还用到了JMF框架,JMF是Java媒体框架,该核心框架支持不同媒体(如:音频输出和视频输出)间的时钟同步。它是一个标准的扩展框架,允许用户制作纯音频流和视频流。编译环境中需要添加JMF框架相关的包到项目的Libraries中。相关JMF的资料请参见参考资料。
结构说明
audio是一个音频播放器的包,可以当成是工具类,也可以应用于音频播放器,只不过只支持有限的音频文件。这里需要利用这个来当视频头捕获到条码时,发出声音提示用户。
impl是bcvp项目的默认实现包,你也可以添加自己的实现,只需要继承BcvpProcesser类,实现如下三个方法即可:
/**
* 获取解析的文本内容
* @param image
* @return
*/
public abstract String getDecodeText(Image image);
/**
* 获取需要解析的图片
* @return
*/
public abstract Image getToDecodeImage();
/**
* 成功后的执行
* @param decodeText
* @param image
*/
public abstract void afterSuccessToDoing(String decodeText, Image image);
util是一个bcvp的工具包。
zxing是封装ZXing项目提供统一调用的包。
BcvpProcesser是bcvp核心处理器,你可以像BcvpProcesserTest.java中那样调用来使用BcvpProcesser来进行工作。
下载
ideawork-bcvp.zip
注意
1、当启动此程序的时候,需要确保PC上已经添加有视频头设备。
2、运行环境依赖ZXing的core.jar跟JMF的jmf.jar,当然还有logger相关的包,项目POM文件中有相关依赖信息。
3、当程序启动后,会打开一个Java Swing窗口,在把印有条码的物件对准视频头时,尽量使之在视频窗口中看得比较清楚(因此这也是效率不高的原因)。
参考资料
ZXing项目地址:http://code.google.com/p/zxing/
JMF官方地址:http://java.sun.com/products/java-media/jmf/index.jsp
JMF中文资讯:http://www.cn-java.com/www1/bbs/viewthread.php?action=printable&tid=16228&sid=nmOj9O