加载中…
正文 字体大小:

Matlab调用ZXing的详细步骤——二维码生成

(2014-04-20 21:38:27)
标签:

matlab

dotnet

zxing

分类: 计算机与 Internet

关于中文编码可以参考这里:
《用ZXing.NET对中文字符串编码》
    最近经常有纸条和留言问我关于Matlab调用ZXing的问题。总的说来,Matlab提供了良好的对Java的支持,所以这本该是一件很容易的事情。从留言上看,主要问题可能在于很多Matlab的用户缺乏对Java的基本了解,无法自行编译Java代码并打包成Jar。即使有了Jar包,由于缺乏对Java的基本了解,也无法正确使用Matlab提供的用于和Java模块通信的各种函数。为了一劳永逸地解决这个问题,我这里提供一份比之前《在Matlab中调用ZXing的代码生成QR二维码》中更详细的指南,可能并不全面,但绝对简单。
    首先需要解决一个必须解决的问题:“我不会编译Java源码,也不会做Jar包,怎么办?”我想了好久,找到了一个绝妙的解决办法:用dotNET版的ZXing!打开页面http://zxingnet.codeplex.com/releases/view/117068,如下
Matlab调用ZXing的详细步骤——二维码生成

点击ZXing.Net.0.14.0.0.zip下载,得到一个zip压缩包。打开压缩包,看见内容如下:
Matlab调用ZXing的详细步骤——二维码生成
压缩包里有net2.0, net3.5, net4.0和net4.5四个文件夹,这些文件夹对应了不同的dotNET版本,根据自己的需要挑选一个,如果实在不知道选哪个,就选版本最低的那个文件夹。打开选中的文件夹,里面有一个名为zxing.dll的文件,解压这个文件,把它放到Current Directory中。这个zxing.dll包含了所有用于生成二维码的代码,拿来用就可以了,比Java版的简单多了吧。作为代价,你的操作系统必须支持dotNET;同时,你的Matlab也必须支持dotNET。Matlab早期版本不支持dotNET,从7的某个版本(好像是7.8)开始,Matlab提供了对dotNET的支持,所以,确保你的Matlab版本足够新。
    现在可以在Matlab中开始操作了。首先,确定文件zxing.dll的完整路径,你可以在资源管理器中选中zxing.dll,然后单击“复制路径”按钮,如下图所示:
Matlab调用ZXing的详细步骤——二维码生成

切换到Matlab的Command Window,执行如下的命令:
>> zxingasm = NET.addAssembly('C:\Users\xialulee\Documents\MATLAB\zxingtest\zxing.dll');
注意上面的路径,你在使用的时候,根据自己zxing的实际路径进行修改。执行完上面的命令之后,zxing.dll就被加载了。想看看zxing.dll提供了哪些类?执行如下的命令:
Matlab调用ZXing的详细步骤——二维码生成

    为了生成二维码,首先需要创建一个ZXing.MultiFormatWriter的实例,执行如下的命令:
>> writer = ZXing.MultiFormatWriter()

writer =

  MultiFormatWriter with properties:

    SupportedWriters: [1x1 System.Collections.Generic.Dictionary*KeyCollection>]

接下来,使用MultiFormatWriter的encode方法,对一个字符串进行编码,如下:
>> mtx = writer.encode('http://blog.sina.com.cn/xialulee', ZXing.BarcodeFormat.QR_CODE, 400, 400)

mtx =

  BitMatrix with properties:

        Width: 400
       Height: 400
    Dimension: 400

到此,编码已经完成。下一步要做的,是从这个名为mtx的BitMatrix实例中提取图像数据。我们可以用它的ToBitmap将其转化为一个dotNET的Bitmap对象,然后想办法将其转化为Matlab矩阵。但是这里为了简单起见,选择了之前就用过的方法:调用mtx的ToString方法,如下:
>> m = char(mtx.ToString());
m对应了一个字符串,其中,一个空格代表白,一个'X'代表黑,两个像素之间使用空格分隔,每一行的结尾使用'\r\n'作换行符。下面将是纯粹的Matlab操作,将字符串转换为Matlab可以接受的图像矩阵。
    首先删除'\r'。'\r'的值等于13,执行如下代码:
>> m(m==13) = [];
删除'\n'。'\n'的值等于10,执行如下代码:
>> m(m==10) = [];
    接下来,删除用于分隔像素的空格,执行如下代码:
>> m = m(1:2:end);
    调用encode方法时,指定的图像尺寸是400×400,使用下面的代码将字符串m转化为400×400的char矩阵:
>> m = reshape(m, 400, 400);
    将char矩阵m中的X替换为0,空格替换为1,使用如下的命令:
>> m(m~='X') = 1;
>> m(m=='X') = 0;
    将char矩阵m转化为double矩阵,同时转置一下,不要忘了Matlab是column-major的语言:
>> m = double(m)';
    显示double矩阵m:
>> imshow(m)
Matlab调用ZXing的详细步骤——二维码生成



扫描一下试试:
Matlab调用ZXing的详细步骤——二维码生成

    完全按照上面的步骤来做,只要软件配置没有问题,我想应该不会出错。即使有错误,也应该比较容易排查。试验成功之后,就可以将上面的操作总结一下,编写一个方便使用的函数了。


Creative Commons License
本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 Unported许可协议进行许可。允许非商业转载,但应注明作者及出处。
作者:xialulee
最初发布于:2014年04月20日,http://blog.sina.com.cn/xialulee



0

阅读 评论 收藏 转载 喜欢 打印举报
已投稿到:
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 不良信息反馈 电话:4006900000 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有