zoukankan      html  css  js  c++  java
  • (zxing.net)二维码Data Matrix的简介、实现与解码

    一、简介

    Data Matrix 二维条码原名Datacode,由美国国际资料公司(International Data Matrix, 简称ID Matrix)于1989年发明。Data-Matrix二维条码是一种矩阵式二维条码。

    Data Matrix符号由规则排列的深浅色正方形模块构成,每个正方形模块就是一个基本单元,每个基本单元又被编码为一比特的数据。数据区的四周是探测图形,用于条码符号定位和确定条码结构信息。探测图形的四周是空白区,用以将条码符号与背景分离。

    探测图形是一个模块的宽度,是数据区的边界,其中全部由深色模块组成的两条邻边构成了一个“L”形实线边缘,“L”对面由交替的深浅模块组成的两条邻边又构成了虚线边缘。探测图形主要用于限定符号的单元结构,也可用于确定符号的物理尺寸,以及解决符号定位和失真等问题。

    数据区是由多个正方形深浅模块所组成的正方形区域,信息储存方式是深浅模块的不同排列组合.以二进制码方式来编码数据,因此计算机可直接读取。深色模块代表“1”,浅色模块代表“0”,再利用成串的特定排列的深浅模块来描述码字信息,再排列成一个矩阵式符号,最终形成Data Matrix条码。

    因此,任意Data Matrix符号可以由四个部分构成:探测图形中“L”形的两条实线边缘、探测图形中“L”形对面的两条虚线边缘、被探测图形包围的数据区、条码符号四周的一个模块宽度的空白区。

    Data Matrix条码编码是将物品信息转化成为数据码字流,用二维条码符号来表示实现。允许输入数据信息多样,可以是数字和字母,可以是常规的文字、字符信息,还可以是多媒体信息,如声音、图片、指纹等。

    Data Matrix分为ECC 000-140和ECC 200两个大类,ECC 000-140具有四个等级的卷积纠错功能,ECC 200则通过Reed—Solomon纠错算法计算纠错码,根据符号的不同尺寸得到不同的纠错码。两类符号的外形区别在于,ECC 000-140符号的右上角为深色模块(仅为奇数),尺寸从9*9至49*49。ECC 200符号的右上角为浅色模块(仅为偶数),尺寸从10*10至144*144,若为长方形则从8*18至16*48。ECC 200应用较多。

    Data Matrix编码包括三个部分:一是将数据信息流通过最优的编码规则转换成数据码字;二是根据Reed-Solomon算法以及响应的纠错要求,在数据码字的基础上生成纠错码字,数据码字加上纠错码字及可能需要的若干填充字符,构成编码后的码字流;三是将按照标准模板将单元模块放置到矩阵中,并加入探测图形,生成Data Matrix二维矩阵码符号。

    Data Matrix二维条码图像的识别主要包括图像预处理、条码定位、采样解码。

    Data Matrix条码图像预处理:首先对采集到的彩色图像灰度化;然后对灰度图像进行滤波去噪;选取适当的阈值进行图像二值化;最后进行边缘提取。

    条码定位:区域初定位、边缘检测、旋转校正、精确提取、条码分割(网格)。

    Data Matrix条码解码识别:根据采样网格,将深浅模块转换为“1”、“0”矩阵;去除探测图形,提取出数据区,并得到条码尺寸和版本信息;调用模块放置矩阵恢复正确顺序的码字流;再确定数据码字和纠错码字,并进行条码数据的检错纠错;最终恢复原始数据,正确解码输出。
    二、实现

            public ActionResult DATA_MATRIX()
            {
                DatamatrixEncodingOptions options = new DatamatrixEncodingOptions();
                options.DefaultEncodation = Encodation.ASCII; /*指定默认编码确保内容符合编码值,否则将抛出异常。 标准值:Encodation.ASCII*/
                //options.MinSize = new Dimension(100, 100);  //指定最小条形码大小 当SymbolShapeHint.FORCE_NONE时 有效
                //options.MaxSize = new Dimension(150, 120); //指定最大条形码大小 当SymbolShapeHint.FORCE_NONE时 有效
                options.SymbolShape = SymbolShapeHint.FORCE_SQUARE; //条码形状
                options.GS1Format = true;    //是否符合GS1 不会用
                options.Width = 150;    //图片宽度
                options.Height = 150;    //图片高度
    
                BarcodeWriter writer = new BarcodeWriter();
                writer.Format = BarcodeFormat.DATA_MATRIX;
                writer.Options = options;
    
                //如需设置图片为其它颜色,使用此段代码
                //BitmapRenderer renderer = new BitmapRenderer();
                //renderer.Foreground = Color.Black;
                //renderer.Background = Color.White;
                //writer.Renderer = renderer;
    
                Bitmap bmp = writer.Write("123456789");
                MemoryStream ms = new MemoryStream();
                bmp.Save(ms, ImageFormat.Png);
                ms.Flush();
                ms.Position = 0;
                return File(ms, "application/x-png");
            }

    测试图像如下:

       

    三、解码

    点击查看

  • 相关阅读:
    native-base中Input,Textarea等组件在ios平台下不能输入中文
    react-native中TextInput在ios平台下不能输入中文
    react-native android/ios 手动/自动 修改版本号
    react-native修改android包名
    React-Native——html/css
    去除npm run dev日志warn记录
    Python并发编程:多进程-互斥锁
    Python并发编程:多进程-守护进程
    Python并发编程:多进程-join方法
    面向对象练习题
  • 原文地址:https://www.cnblogs.com/weiweixiang/p/10076208.html
Copyright © 2011-2022 走看看