精华内容
下载资源
问答
  • 二维码的编码与解码实现
    千次阅读
    2019-10-16 10:24:21

    VB二维码生成与解码的代码,特别支持中文的二维码编码和译码

    代码片

    下面展示一些 内联代码片

    // VB  代码
    
    //保存二维码图片
    Private Sub Command1_Click()
        Printer.ScaleMode = 6
        Picture1.Picture = QRmaker1.Picture
        
        CommonDialog1.DialogTitle = "保存二维码图片"
        CommonDialog1.Filter = "All Files (*.*)|*.*|BMP Files (*.bmp)|*.bmp|JPGE Files (*.jpg)|*.jpg"
        CommonDialog1.FilterIndex = 3
        CommonDialog1.ShowSave
        
        If CommonDialog1.FileName <> "" Then
            SavePicture Picture1.Image, CommonDialog1.FileName
        End If
    End Sub
    
    //Unicode解码得到中文
    Private Sub DecodeTxt_Change()
        S = HexToStr(DecodeTxt.Text)
    '    MsgBox S
        ResultTxt.Text = S
    End Sub
    
    Private Sub Form_Load()
        With QRmaker1
            .ModelNo = 2
            .CellPitch = 10
            .CellUnit = 500
            .QuietZone = 0
            .InputData = "123abc!@?测试's developer"
            .Refresh
        End With
        
        txtInputData.Text = "test12ab%!?测试's developer"
        
    End Sub
    
    Private Sub txtInputData_Click()
        txtInputData.Text = ""
        QRmaker1.Refresh
    End Sub
    
    //中文编码得到Unicode
    Private Sub txtInputData_Change()
    
        Dim S1 As String
        
        S1 = StrToHex(txtInputData.Text)
        QRmaker1.InputData = S1
        QRmaker1.AutoRedraw = ArOn
        
    End Sub
    

    供交流分享,欢迎打赏,新手入门,攒攒积分。

    更多相关内容
  • Java实现二维码编码与解码

    千次阅读 2022-03-31 13:45:05
    Java使用谷歌的zxing包实现二维码编码与解码

    1、构建maven项目,导入对应依赖


    这里引用谷歌的zxing包实现二维码的编码与解码,导入依赖如下所示

    <!-- 谷歌二维码 -->
    <dependency>
        <groupId>com.google.zxing</groupId>
        <artifactId>core</artifactId>
        <version>3.3.0</version>
    </dependency>
    

    2、编写编码与解码方法


    二维码生成工具类如下所示

    
    import java.awt.BasicStroke;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Image;
    import java.awt.Shape;
    import java.awt.geom.AffineTransform;
    import java.awt.geom.RoundRectangle2D;
    import java.awt.image.BufferedImage;
    import java.io.*;
    import java.util.Base64;
    import java.util.Hashtable;
    import javax.imageio.ImageIO;
    
    import com.google.zxing.*;
    import com.google.zxing.common.BitMatrix;
    import com.google.zxing.common.HybridBinarizer;
    import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
    
    public class QrCodeUtil {
        private static final String CHARSET = "utf-8";
        private static final String IMAGE_SUFFIX = "JPG";
        /**
         * 二维码尺寸
         */
        private static final int QRCODE_SIZE = 300;
        /**
         * LOGO宽度
         */
        private static final int WIDTH = 60;
        /**
         * LOGO高度
         */
        private static final int HEIGHT = 60;
    
        /**
         * 生成二维码图片, 可自定义容错率
         * @param content  二维码内容
         * @param logoPath  logo图片路径
         * @param needCompress  是否需要压缩
         * @param level  L-7%  M-15%   Q-25%  H-30%  容错级别
         * @return
         * @throws Exception
         */
        private static BufferedImage createImage(String content, String logoPath, boolean needCompress, ErrorCorrectionLevel level) throws Exception {
            Hashtable hints = new Hashtable();
            hints.put(EncodeHintType.ERROR_CORRECTION, level);
            hints.put(EncodeHintType.CHARACTER_SET, CHARSET);
            hints.put(EncodeHintType.MARGIN, 1);
            //生成二维码
            BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE, hints);
            int width = bitMatrix.getWidth();
            int height = bitMatrix.getHeight();
            BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            //构建图片
            for (int x = 0; x < width; x++) {
                for (int y = 0; y < height; y++) {
                    image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);
                }
            }
            if (logoPath == null || "".equals(logoPath)) {
                return image;
            }
            // 插入图片,即中间显示的logo
            insertImage(image, logoPath, needCompress);
            return image;
        }
    
        /**
         * 生成二维码图片
         * @param content  二维码文字内容
         * @param logoPath  logo图片路径
         * @param needCompress  是否需要压缩
         * @return
         * @throws Exception
         */
        private static BufferedImage createImage(String content, String logoPath, boolean needCompress) throws Exception {
            return createImage(content, logoPath, needCompress, ErrorCorrectionLevel.H);
        }
    
        /**
         * 往二维码插入图片(logo)
         * @param source  二维码图片
         * @param imgPath  logo路径
         * @param needCompress  是否需要压缩
         * @throws Exception
         */
        private static void insertImage(BufferedImage source, String imgPath, boolean needCompress) throws Exception {
            File file = new File(imgPath);
            if (!file.exists()) {
                System.err.println("" + imgPath + "   该文件不存在!");
                return;
            }
    
            //获取源图片
            Image image = ImageIO.read(new File(imgPath));
            int width = image.getWidth(null);
            int height = image.getHeight(null);
            // 压缩LOGO
            if (needCompress) {
                width = width > WIDTH ? WIDTH : width;
                height = height > HEIGHT ? HEIGHT : height;
                image = image.getScaledInstance(width, height, Image.SCALE_SMOOTH);
                BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
                Graphics g = tag.getGraphics();
                // 绘制缩小后的图
                g.drawImage(image, 0, 0, null);
                g.dispose();
            }
            // 插入LOGO
            Graphics2D graph = source.createGraphics();
            int x = (QRCODE_SIZE - width) / 2;
            int y = (QRCODE_SIZE - height) / 2;
            graph.drawImage(image, x, y, width, height, null);
            Shape shape = new RoundRectangle2D.Float(x, y, width, width, 6, 6);
            graph.setStroke(new BasicStroke(3f));
            graph.draw(shape);
            graph.dispose();
        }
    
        /**
         * 编码生成二维码图片,固化到硬盘
         * @param content  二维码文字内容
         * @param logoPath  插入的logo路径
         * @param destPath  生成的二维码输出路径
         * @param needCompress  是否需要压缩
         * @param level  容错率
         * @throws Exception
         */
        public static void encode(String content, String logoPath, String destPath, boolean needCompress, ErrorCorrectionLevel level) throws Exception {
            mkdirs(destPath);
            ImageIO.write(createImage(content, logoPath, needCompress, level), IMAGE_SUFFIX, new File(destPath));
        }
    
        /**
         * 编码生成二维码图片,固化到硬盘
         * @param content  二维码文字内容
         * @param logoPath  logo图片路径
         * @param destPath  生成的二维码输出路径
         * @param needCompress  是否需要压缩
         * @throws Exception
         */
        public static void encode(String content, String logoPath, String destPath, boolean needCompress) throws Exception {
            mkdirs(destPath);
            ImageIO.write(createImage(content, logoPath, needCompress), IMAGE_SUFFIX, new File(destPath));
        }
    
        /**
         * 编码生成二维码图片,固化到硬盘
         * @param content  二维码文字内容
         * @param logoPath  logo图片路径
         * @param destPath  生成的二维码输出路径
         * @throws Exception
         */
        public static void encode(String content, String logoPath, String destPath) throws Exception {
            encode(content, logoPath, destPath, false);
        }
    
        /**
         * 编码生成二维码图片,固化到硬盘
         * @param content  二维码文字内容
         * @param destPath  生成的二维码输出路径
         * @throws Exception
         */
        public static void encode(String content, String destPath) throws Exception {
            encode(content, null, destPath, false);
        }
    
        /**
         * 编码生成二维码图片,输出到流
         * @param content  二维码文字内容
         * @param logoPath  logo图片路径
         * @param output  输出流
         * @param needCompress  是否需要压缩
         * @throws Exception
         */
        public static void encode(String content, String logoPath, OutputStream output, boolean needCompress) throws Exception {
            ImageIO.write(createImage(content, logoPath, needCompress), IMAGE_SUFFIX, output);
        }
    
        /**
         * 编码生成二维码图片,输出到流
         * @param content  二维码文字内容
         * @param output  输出流
         * @throws Exception
         */
        public static void encode(String content, OutputStream output) throws Exception {
            encode(content, null, output, false);
        }
    
        /**
         * 编码生成二维码图片,转化为base64字符串
         * @param content  二维码文字内容
         * @param imgPath  logo图片路径
         * @param needCompress  是否需要压缩
         * @param level  容错率
         * @param imageSuffix  生成的图片后缀
         * @return
         * @throws Exception
         */
        public static String encode(String content, String imgPath, boolean needCompress, ErrorCorrectionLevel level, String imageSuffix) throws Exception {
            imageSuffix = (imageSuffix == null || "".equals(imageSuffix)) ? IMAGE_SUFFIX : imageSuffix;
            BufferedImage image = createImage(content, imgPath, needCompress, level);
            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            ImageIO.write(image, imageSuffix, stream);
            return Base64.getEncoder().encodeToString(stream.toByteArray());
        }
    
        /**
         * 编码生成二维码图片,直接返回图片对象
         * @param content  二维码文字内容
         * @param logoPath  logo图片路径
         * @param needCompress  是否需要压缩
         * @return
         * @throws Exception
         */
        public static BufferedImage encode(String content, String logoPath, boolean needCompress) throws Exception {
            return createImage(content, logoPath, needCompress);
        }
    
        /**
         * 二维码解码读取文字信息
         * @param image 二维码图片
         * @return
         * @throws Exception
         */
        public static String decode(BufferedImage image) throws Exception {
            if (image == null) { return null; }
            BufferedImageLuminanceSource source = new BufferedImageLuminanceSource(image);
            BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
            Hashtable hints = new Hashtable();
            //设置编码方式
            hints.put(DecodeHintType.CHARACTER_SET, CHARSET);
            //优化精度,解决com.google.zxing.NotFoundException
            hints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);
            //开启PURE_BARCODE模式(复杂模式)
            hints.put(DecodeHintType.PURE_BARCODE, Boolean.TRUE);
            Result result = new MultiFormatReader().decode(bitmap, hints);
            return result.getText();
        }
    
        /**
         * 二维码解码读取文字信息
         * @param file 二维码图片
         * @return
         * @throws Exception
         */
        public static String decode(File file) throws Exception {
            return decode(ImageIO.read(file));
        }
    
        /**
         * 二维码解码读取文字信息
         * @param base64Str  二维码图片base64格式字符串
         * @return
         * @throws Exception
         */
        public static String decode(String base64Str) throws Exception{
            return decode(ImageIO.read(new ByteArrayInputStream(Base64.getDecoder().decode(base64Str))));
        }
    
        /**
         * 创建文件夹
         * @param destPath  文件夹路径
         */
        public static void mkdirs(String destPath) {
            File file = new File(destPath);
            // 当文件夹不存在时,mkdirs会自动创建多层目录,区别于mkdir.(mkdir如果父目录不存在则会抛出异常)
            if (!file.exists() && !file.isDirectory()) {
                file.mkdirs();
            }
        }
    
    	public static class BufferedImageLuminanceSource extends LuminanceSource {
    
            private final BufferedImage image;
            private final int left;
            private final int top;
    
            public BufferedImageLuminanceSource(BufferedImage image) {
                this(image, 0, 0, image.getWidth(), image.getHeight());
            }
    
            public BufferedImageLuminanceSource(BufferedImage image, int left, int top, int width, int height) {
                super(width, height);
    
                int sourceWidth = image.getWidth();
                int sourceHeight = image.getHeight();
                if (left + width > sourceWidth || top + height > sourceHeight) {
                    throw new IllegalArgumentException("Crop rectangle does not fit within image data.");
                }
    
                for (int y = top; y < top + height; y++) {
                    for (int x = left; x < left + width; x++) {
                        if ((image.getRGB(x, y) & 0xFF000000) == 0) {
                            image.setRGB(x, y, 0xFFFFFFFF); // = white
                        }
                    }
                }
    
                this.image = new BufferedImage(sourceWidth, sourceHeight, BufferedImage.TYPE_BYTE_GRAY);
                this.image.getGraphics().drawImage(image, 0, 0, null);
                this.left = left;
                this.top = top;
            }
    
            @Override
            public byte[] getRow(int y, byte[] row) {
                if (y < 0 || y >= getHeight()) {
                    throw new IllegalArgumentException("Requested row is outside the image: " + y);
                }
                int width = getWidth();
                if (row == null || row.length < width) {
                    row = new byte[width];
                }
                image.getRaster().getDataElements(left, top + y, width, 1, row);
                return row;
            }
    
            @Override
            public byte[] getMatrix() {
                int width = getWidth();
                int height = getHeight();
                int area = width * height;
                byte[] matrix = new byte[area];
                image.getRaster().getDataElements(left, top, width, height, matrix);
                return matrix;
            }
    
            @Override
            public boolean isCropSupported() {
                return true;
            }
    
            @Override
            public LuminanceSource crop(int left, int top, int width, int height) {
                return new BufferedImageLuminanceSource(image, this.left + left, this.top + top, width, height);
            }
    
            @Override
            public boolean isRotateSupported() {
                return true;
            }
    
            @Override
            public LuminanceSource rotateCounterClockwise() {
                int sourceWidth = image.getWidth();
                int sourceHeight = image.getHeight();
                AffineTransform transform = new AffineTransform(0.0, -1.0, 1.0, 0.0, 0.0, sourceWidth);
                BufferedImage rotatedImage = new BufferedImage(sourceHeight, sourceWidth, BufferedImage.TYPE_BYTE_GRAY);
                Graphics2D g = rotatedImage.createGraphics();
                g.drawImage(image, transform, null);
                g.dispose();
                int width = getWidth();
                return new BufferedImageLuminanceSource(rotatedImage, top, sourceWidth - (left + width), getHeight(), width);
            }
    
        }
    }
    
    

    主要方法功能描述如下:

    • createImage():生成二维码图片

    createImage()重载了两个方法,其中 createImage(String content, String logoPath, boolean needCompress, ErrorCorrectionLevel level)方法可通过level参数调节二维码容错率;createImage(String content, String logoPath, boolean needCompress)方法使用固定的容错率:ErrorCorrectionLevel.H。

    • insertImage():往二维码插入图片(logo),可以调用此方法在二维码中间位置插入一个logo
    • encode():进行二维码编码
      此方法重载了几个方法返回不同的结果,如:直接生成二维码图片固化到硬盘;生成BASE64字符串返回;直接返回BufferedImage图片对象。
    • decode():对二维码进行解码,获取文字内容

    3、编写测试代码


    编写测试代码进行不同返回对象的测试,测试代码如下所示

    public static void main(String[] args) throws Exception {
            // 存放在二维码中的内容
            String text = "使用 com.google.zxing 依赖生成二维码图片,encode()方法生成二维码图片,decode()方法将二维码解码获取文字内容\n" ;
            // 嵌入二维码的图片(logo)路径
            String imgPath = "E:/templates/0.jpg";
            // 生成的二维码的路径及名称
            String destPath = "E:/templates/qrcode/1.jpg";
            // 生成的二维码的路径及名称
            String destPath1 = "E:/templates/qrcode/2.jpg";
    
            //生成不带logo的二维码
            QrCodeUtil.encode(text, null, destPath, true, ErrorCorrectionLevel.L);
    
            //生成带logo的二维码
            QrCodeUtil.encode(text, imgPath, destPath1, true, ErrorCorrectionLevel.L);
    
            // 解析二维码
            String str = QrCodeUtil.decode(new File(destPath1));
            // 打印出解析出的内容
            System.out.println(str);
    
            //图片生成base64字符串
            String base64 = QrCodeUtil.encode(text, imgPath, true, ErrorCorrectionLevel.L, "png");
            System.out.println("\nbase64字符串:" + base64);
            System.out.println("\n二维码解码内容:" + QrCodeUtil.decode(base64));
    
        }
    

    4、可能遇到的问题

    1. 解析二维码报错com.google.zxing.NotFoundException
      原因:二维码所有的bit都是0,生成二维码时白色像素使用透明色填充。在显示时因为背景是白色,所以看上去和用手机扫都没有问题,但是在代码识别的时候会把透明色识别为黑色,这样就导致整个二维码图片全是黑色像素,抛出com.google.zxing.NotFoundException异常。
      解决方案:优化精度,解码时配置参数
            //优化精度,解决com.google.zxing.NotFoundException
            hints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);
            //开启PURE_BARCODE模式(复杂模式)
            hints.put(DecodeHintType.PURE_BARCODE, Boolean.TRUE);
    
    1. 扫码时由于文字太多无法识别
      解决方案: 调整ErrorCorrectionLevel 参数,适当调整容错率(7%~30%)。
      对应四个级别:
      ErrorCorrectionLevel.L (7%)
      ErrorCorrectionLevel.M (15%)
      ErrorCorrectionLevel.Q (25%)
      ErrorCorrectionLevel.H (30%)
      容错率越高,二维码的有效像素点越多。
    展开全文
  • QRCode.jar包和二维码编码与解码实现
  • QRCode 二维码编码解码标准附录.pdf
  • DataMatrix 二维码生成 和解码 C#程序,亲测可用。解码是Freytag DataMatrixDecoder A c# implementation to find DataMatrix 'barcodes' in bitmaps and decode them back into a string.
  • 软件的开发平台是.net 开发,开发环境是 vs2010 实现功能是 qr二维码编码 解码
  • C#写的二维码编码类和二维码解码类,不调用任何控件,方便翻译成任何语言,可在任意平台上运行。 内有说明文档,说明怎样设置和调用,使用非常的方便,编码一个类,解码一个类,不像网上搜索的那些各种复杂不好用,...
  • 完整二维码编码解码包,本人收集整合成一个包,并附带完整的工具方法和运行例子可直接使用到手机客户端或应用。 解压后,引用TwoDimCode.jar包,运行使用TwoDimCode.java 绝对超值,下载看看吧!
  • 本文主要介绍Java实现二维码QRCode的编码解码,这里给大家一个小示例以便理解,有需要的小伙伴可以参考下
  • 很简单的一个java二维码编码与解码的说明文档,只需要你创建一个java程序,将代码复制过去就能用,新手也能看明白哦
  • Java也可以实现二维码解码编码,现用Java实现二维码中QRCode的编码解码
  • 它还可以从屏幕截图中解码二维码。 截图 建造 在构建 qrcode-desktop 之前,您的系统上必须安装以下软件包: jdk 行家 打开终端并切换到qrcode-desktop目录。 键入以下命令以构建 jar 存档: mvn package 如果...
  • C#二维码编码解码器源码
  • .net二维码编码解码器源码
  • 二维码编码解码

    2013-01-04 10:09:49
    二维码编码解码,QR code的编码原理,解码原理。
  • C#二维码编码解码

    2011-07-20 14:46:43
    在csdn下载的qrcode,在vs2010下编译总是有错,于是我重新封装了一下,win7+vs2010下测试通过。生成的二维码图片使用iphone4的识别软件准确无误,放上源代码,大家一起研究一下。
  • 二维码编码/解码

    2013-03-04 13:23:20
    一个能将网址编码二维码或将二维码解码成网址的小工具。
  • 完整的能够实现将文本文件编码二维码图片或将二维码图片解码为文本的小工具。 基于zxing的解码库,libqrcode的编码库,开源可根据需求修改。 vs工程、c++编写,命令行下输入参数即可实现转化,移植性强。 支持中文...
  • 用C#实现的条形码和二维码编码解码器,.winform项目中添加对zxing项目的引用. 大家都知道现在QR码越来越好看了,可以给里面加入各种图案和图像。QRcode采用里德-所罗门码来进行编码,里德-所罗门码是一种带有容错机制...
  • 用C#实现的条形码和二维码编码解码器,.winform项目中添加对zxing项目的引用. 大家都知道现在QR码越来越好看了,可以给里面加入各种图案和图像。QRcode采用里德-所罗门码来进行编码,里德-所罗门码是一种带有容错机制...
  • 二维码编码解码器源码 本源码实现可以在C#中使用的1D/2D编码解码器。条形码的应用已经非常普遍,几乎所有超市里面的商品上面都印有条形码;二维码也开始应用到很多场合,如火车票有二维码识别、网易的首页有二维码...
  • 二维码编码解码库zbar64,可在VS2019正常使用,普通zbar用不了是因为不是64位的
  • C sharp的二维码编码解码程序,QRCode支持纠错码,有Windows及Windows Mobile的完整工程
  • QR二维码编码解码程序

    热门讨论 2013-12-26 17:56:16
    这是QR二维码编码解码程序,两个工程放在同一个工作空间中,便于大家学习,调试程序,已经在VC6.0下成功编译,运行正常。
  • Qr 二维码 编码解码

    2011-08-29 14:41:32
    Qr 二维码 编码解码 完整Eclipse项目,jdk1.5
  • 这是我的本科毕业设计:基于加密的二维码编码解码的小软件 摘要 全国代码管理中心为了提高代码信息化服务水平,提高代码业务处理效率,需要建立一套新的组织机构代码业务信息采集系统。 在目前仍然使用的旧系统当中...
  • STM32F103实现生成二维码,并实现解码展示 STM32F103实现生成二维码,并实现解码展示 STM32F103实现生成二维码,并实现解码展示 STM32F103实现生成二维码,并实现解码展示

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,656
精华内容 3,462
热门标签
关键字:

二维码的编码与解码实现