二维码和条形码是啥关系?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二维码和条形码是啥关系?相关的知识,希望对你有一定的参考价值。

二维码属于条形码的一种,全称为二维条形码。

二维条形码依靠其庞大的信息携带量,能够把过去使用一维条形码时存储于后台数据库中的信息包含在条形码中,可以直接通过阅读条形码得到相应的信息,并且二维条形码还有错误修正技术及防伪功能,增加了数据的安全性。

扩展资料:

条形码不能辨别商品真伪

条形码能够体现商品的产地、生产厂家、品种等内容,其主要作用是追溯商品的信息,并不能完全靠条形码来确认真伪。

目前市民所用的扫码软件,大多是企业开发,并非官方数据,其本质是依赖其后台所建立的软件数据库,如果数据库里暂时没有储存相关产品的信息,那么在使用扫码软件扫商品时,即使是正品商品,也会出现扫不出任何信息的情况。同样,如果生产假货的不法商家盗取了正规商家的条形码,那么消费者即使扫描到信息也有可能是假货。

参考资料来源:百度百科——条形码

参考技术A 条形码的名称来源于一维码,因为一维码的形状是由很多黑、白条组成的。一维码只在水平方向上表示信息,容量小,表示的信息有限,因此人们开始研究能表示更多信息的条形码,开始人们尝试把多个一维码层叠起来,每一层都可以表示一定的信息,这就是最初的二维码——层排式二维码。后来人们利用信息编码技术发明了矩阵式二维码,这种二维码具有更大的容量,但外观上已经不同于一维条码了,只是仍然沿用了条形码的名称。因此,从形态上条形码分为一维条形码和二维条形码,即二维码是条形码的一个类型。^本回答被提问者和网友采纳 参考技术B 回答

您好,您的问题我已经看到了,答案正在飞速整理中,请您稍等两分钟~

您好,1、二维码又称二维条码,常见的二维码为QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型。二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的、黑白相间的、记录数据符号信息的图形;在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理:它具有条码技术的一些共性:每种码制有其特定的字符集;每个字符占有一定的宽度;具有一定的校验功能等。同时还具有对不同行的信息自动识别功能、及处理图形旋转变化点。2、条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。条形码可以标出物品的生产国、制造厂家、商品名称、生产日期、图书分类号、邮件起止地点、类别、日期等许多信息,因而在商品流通、图书管理、邮政管理、银行系统等许多领域都得到广泛的应用 。

参考技术C 一维条形码通常具有校验功能以防止错读,一旦条形码发生污损将被拒读。而二维条形码不仅能防止错误,而且能纠正错误,即使条形码部分损坏,也能将正确的信息还原出来。
  3. 印制要求不高
  普通打印设备均可打印,传真件也能阅读。
  4. 可用多种阅读设备阅读
  PDF417码可用带光栅的激光阅读器,线性及面扫描的图像式阅读器阅读。
  5. 尺寸可调以适应不同的打印空间
  6. 码制公开已形成国际标准,中国也已制定了417码的国标。
  三)PDF417的纠错功能
  二维条形码的纠错功能是通过将部分信息重复表示(冗余)来实现的。比如在PDF417码中,某一行除了包含本行的信息外,还有一些反映其它位置上的字符(错误纠正码)的信息。这样,即使当条形码的某部分遭到损坏,也可以通过存在于其它位置的错误纠正码将其信息还原出来。
  PDF417的纠错能力依错误纠正码字数的不同分为0~8共9级,见图4,级别越高,纠正码字数越多,纠正能力越强,条形码也越大。当纠正等级为8时,即使条形码污损50%也能被正确读出。
参考技术D 二维码是条形码的一种。

条形码和二维码

技术图片
技术图片
技术图片
技术图片
代码出处:https://www.icourse163.org/learn/ECNU-1003718005#/learn/content?type=detail&id=1211641386&cid=1214440862

Pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.zyb</groupId>
    <artifactId>BarcodeTest</artifactId>
    <version>1.0-SNAPSHOT</version>
<dependencies>
    <dependency>
        <groupId>com.google.zxing</groupId>
        <artifactId>core</artifactId>
        <version>3.3.3</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.google.zxing/javase -->
    <dependency>
        <groupId>com.google.zxing</groupId>
        <artifactId>javase</artifactId>
        <version>3.3.3</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/net.sf.barcode4j/barcode4j -->
    <dependency>
        <groupId>net.sf.barcode4j</groupId>
        <artifactId>barcode4j</artifactId>
        <version>2.1</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.avalon.framework/avalon-framework-api -->
    <dependency>
        <groupId>org.apache.avalon.framework</groupId>
        <artifactId>avalon-framework-api</artifactId>
        <version>4.3.1</version>
    </dependency>
</dependencies>

</project>

条形码的解析和生成(Goole的第三方库)

package zxing;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.DecodeHintType;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.Result;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.util.HashMap;
import java.util.Map;

public class BarCodeTest {
    /**
     * generateCode 根据code生成相应的一维码
     * @param file 一维码目标文件
     * @param code 一维码内容
     * @param width 图片宽度
     * @param height 图片高度
     */
    public static void generateCode(File file, String code, int width, int height) {
        //定义位图矩阵BitMatrix
        BitMatrix matrix = null;
        try {
            // 使用code_128格式进行编码生成100*25的条形码
            MultiFormatWriter writer = new MultiFormatWriter();

            matrix = writer.encode(code,BarcodeFormat.CODE_128, width, height, null);
            //matrix = writer.encode(code,BarcodeFormat.EAN_13, width, height, null);
        } catch (WriterException e) {
            e.printStackTrace();
        }

        //将位图矩阵BitMatrix保存为图片
        try (FileOutputStream outStream = new FileOutputStream(file)) {
            ImageIO.write(MatrixToImageWriter.toBufferedImage(matrix), "png",
                    outStream);
            outStream.flush();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * readCode 读取一张一维码图片
     * @param file 一维码图片名字
     */
    public static void readCode(File file){
        try {
            BufferedImage image = ImageIO.read(file);
            if (image == null) {
                return;
            }
            LuminanceSource source = new BufferedImageLuminanceSource(image);
            BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));

            Map<DecodeHintType, Object> hints = new HashMap<>();
            hints.put(DecodeHintType.CHARACTER_SET, "GBK");
            hints.put(DecodeHintType.PURE_BARCODE, Boolean.TRUE);
            hints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);

            Result result = new MultiFormatReader().decode(bitmap, hints);
            System.out.println("条形码内容: "+result.getText());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws Exception {
        //generateCode(new File("1dcode.png"), "you are a pig", 500, 250);
        readCode(new File("1dcode.png"));
    }
}

二维码生成和解析(Goole的第三方库)

package zxing;

import com.google.zxing.*;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.nio.file.Path;
import java.util.HashMap;
import java.util.Map;

public class QRCodeTest {
    /*
     * 定义二维码的宽高
     */
    private static int WIDTH = 300;
    private static int HEIGHT = 300;
    private static String FORMAT = "png";//二维码格式

    //生成二维码
    public static void generateQRCode(File file, String content) {
        //定义二维码参数
        Map<EncodeHintType, Object> hints = new HashMap<>();

        hints.put(EncodeHintType.CHARACTER_SET, "utf-8");//设置编码
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);//设置容错等级
        hints.put(EncodeHintType.MARGIN, 2);//设置边距默认是5

        try {
            BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, WIDTH, HEIGHT, hints);
            Path path = file.toPath();
            MatrixToImageWriter.writeToPath(bitMatrix, FORMAT, path);//写到指定路径下

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    //读取二维码
    public static void readQrCode(File file) {
        MultiFormatReader reader = new MultiFormatReader();
        try {
            BufferedImage image = ImageIO.read(file);
            BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(new BufferedImageLuminanceSource(image)));
            Map<DecodeHintType, Object> hints = new HashMap<>();
            hints.put(DecodeHintType.CHARACTER_SET, "utf-8");//设置编码
            Result result = reader.decode(binaryBitmap, hints);
            System.out.println("解析结果:" + result.toString());
            System.out.println("二维码格式:" + result.getBarcodeFormat());
            System.out.println("二维码文本内容:" + result.getText());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        generateQRCode(new File("2dcode.png"), "https://www.baidu.com");
       // readQrCode(new File("2dcode.png"));
        //readQrCode(new File("2dcode.jpg"));
    }
}

条形码生成和解析(BarCode4j的第三方库)

package barcode4j;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;

import org.krysalis.barcode4j.impl.code39.Code39Bean;
import org.krysalis.barcode4j.impl.upcean.EAN13Bean;
import org.krysalis.barcode4j.output.bitmap.BitmapCanvasProvider;
import org.krysalis.barcode4j.tools.UnitConv;


public class BarCodeTest {

    public static void main(String[] args) {
        String msg = "123456789012";
        String path = "1dcode.png";
        generateFile(msg, path);
    }

    public static void generateFile(String msg, String path) {
        File file = new File(path);
        try {
            Code39Bean bean = new Code39Bean();
            //EAN13Bean bean = new EAN13Bean();

            // dpi精度
            final int dpi = 150;
            // module宽度
            //bean.setModuleWidth(0.2);
            final double width = UnitConv.in2mm(2.0f / dpi);
            bean.setWideFactor(3);
            bean.setModuleWidth(width);
            bean.doQuietZone(false);

            String format = "image/png";
            // 输出到流
            BitmapCanvasProvider canvas = new BitmapCanvasProvider(new FileOutputStream(file), format, dpi,
                    BufferedImage.TYPE_BYTE_BINARY, false, 0);

            // 生成条形码
            bean.generateBarcode(canvas, msg);

            // 结束绘制
            canvas.finish();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

二维码生成和解析(BarCode4j的第三方库)

package barcode4j;

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.DefaultConfiguration;
import org.krysalis.barcode4j.BarcodeGenerator;
import org.krysalis.barcode4j.BarcodeUtil;
import org.krysalis.barcode4j.output.bitmap.BitmapCanvasProvider;
import org.krysalis.barcode4j.tools.MimeTypes;

public class DataMatrixCodeTest {
    
    public static void main(String[] args) throws Exception {

        BarcodeUtil util = BarcodeUtil.getInstance();
        BarcodeGenerator gen = util.createBarcodeGenerator(buildCfg("datamatrix"));

        OutputStream fout = new FileOutputStream("2dcode.png");
        int resolution = 300;
        BitmapCanvasProvider canvas = new BitmapCanvasProvider(fout, "image/png", resolution,
                BufferedImage.TYPE_BYTE_BINARY, false, 0);

        gen.generateBarcode(canvas, "be the coder");
        canvas.finish();
    }

    private static Configuration buildCfg(String type) {
        DefaultConfiguration cfg = new DefaultConfiguration("barcode");

        // Bar code type
        DefaultConfiguration child = new DefaultConfiguration(type);
        cfg.addChild(child);

        // Human readable text position
        DefaultConfiguration attr = new DefaultConfiguration("human-readable");
//      DefaultConfiguration subAttr = new DefaultConfiguration("placement");
//      subAttr.setValue("bottom");
//      attr.addChild(subAttr);
//      child.addChild(attr);
//      datamatrix code has no human-readable part
//      see http://barcode4j.sourceforge.net/2.1/symbol-datamatrix.html
        
        attr = new DefaultConfiguration("height");
        attr.setValue(50);
        child.addChild(attr);
        attr = new DefaultConfiguration("module-width");
        attr.setValue("0.6");
        child.addChild(attr);
        return cfg;
    }
}

以上是关于二维码和条形码是啥关系?的主要内容,如果未能解决你的问题,请参考以下文章

Azure Forms Recognizer 可以扫描条形码、二维码或图像吗

二维码是啥?

iOS系统原生二维码条形码扫描

用C#实现的条形码和二维码编码解码器

iOS - 原生的CIFilter生成二维码和条形码

二维条形码商品的规格是怎么的