精华内容
下载资源
问答
  • Qrcode

    2020-08-09 15:42:10
    QRQR code的结构QR的容量用python+qrcode制作QR安装qrcode最简补充在QR上放图片 参考了某书.(跟以前一样那本) QR code的结构 QR code由边框区和数据区所组成,数据区由定位标记、校正图块、版本信息、原始信息、...

    参考了某书.(跟以前一样那本)

    QR code的结构


    QR code由边框区和数据区所组成,数据区由定位标记、校正图块、版本信息、原始信息、容错信息所组成,这些信息经过编码后产生二进制字符串,白色格子代表0,黑色格子代表1,这些格子一般又称作模块。其实经过编码后,还会使用屏蔽(masking)方法将原始二进制字符串与屏蔽图案(Mask Pattern)做XOR运算,产生实际的编码,经过处理后的QR code辨识率将更高。

    在这里插入图片描述

    • 边框区
      也可以称为非数据区,主要是避免QR code周围的图像影响辨识。
    • 定位标记
      在上述图片中,左上、左下、右上是定位标记,外型类似“回”字,在使用QRcode扫描时我们可以发现不用完全对准也可以,主要是这3个定位标记在帮助扫描定位。
    • 校正图块
      主要用于校正辨识。
    • 容错修功能
      QR code有容错功能,所以如果QR code有破损,有时仍然可以读取,一般QRcode的面积越大,容错能力越强。
      在这里插入图片描述

    QR的容量

    QR code目前有40个不同版本,版本1是21×21个模块。模块是QR code最小的单位,每增加一个版本,长宽各增加4个模块,所以版本40是由177×177个模块组成,下列是以版本40为例做容量解说。

    在这里插入图片描述

    用python+qrcode制作QR

    安装qrcode

    在这里插入图片描述

    最简

    在这里插入图片描述

    补充

    qrcode.make( )方法内含3个子方法,整个方法原始码如下:
    在这里插入图片描述

    **kwargs:

    • version:QR code的版次,可以设置1~40的版次。
    • error_correction:容错率,可选7%、15%、25%、30%,参数如下:
      • qrcode.constants.ERROR_CORRECT_L:7%
      • qrcode.constants.ERROR_CORRECT_M:15%(预设)
      • qrcode.constants.ERROR_CORRECT_Q:25%
      • qrcode.constants.ERROR_CORRECT_H:30%
    • box_size:每个模块的像素个数。
    • border:边框区的厚度,预设是4。
    • image_factory:图片格式,默认是PIL。
    • mask_pattern:mask_pattern参数是0~7,如果省略会自行使用最适当的方法。

    在QR上放图片

    这图片,别在意

    import qrcode
    from PIL import Image
    
    img = qrcode.make('https://music.163.com/#').convert('RGB')
    w,h = img.size
    
    with Image.open('1.jpg') as i:
        ii = i.crop((200,100,250,150))
        ww,hh = ii.size
        img.paste(ii,((w-ww)//2,(h-hh)//2))
        
    

    在这里插入图片描述

    展开全文
  • QRCode

    2019-05-12 21:02:37
    image_qrcode = view.findViewById(R.id.image_qrcode); btn_scan = view.findViewById(R.id.btn_scan); btn_show = view.findViewById(R.id.btn_show); btn_scan.setOnClickListener(this); btn_show....

    权限 

        <!-- 添加相机权限-->
        <uses-permission android:name="android.permission.CAMERA"/>
    
        <!-- 添加震动权限-->
        <uses-permission android:name="android.permission.VIBRATE"/>

    MyApp注册

    package com.example.qrcode.app;
    
    import android.app.Application;
    
    import com.uuzuche.lib_zxing.activity.ZXingLibrary;
    
    public class BaseApplication extends Application {
        @Override
        public void onCreate() {
            super.onCreate();
            //初始化二维码
            ZXingLibrary.initDisplayOpinion(this);
        }
    }
    
    

    展示页面

    package com.example.qrcode.fragment;
    
    import android.Manifest;
    import android.content.Intent;
    import android.content.pm.PackageManager;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.os.Bundle;
    import android.support.annotation.NonNull;
    import android.support.annotation.Nullable;
    import android.support.v4.app.ActivityCompat;
    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentManager;
    import android.support.v4.app.FragmentTransaction;
    import android.support.v4.content.PermissionChecker;
    import android.text.TextUtils;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.Button;
    import android.widget.ImageView;
    import android.widget.Toast;
    
    import com.example.qrcode.R;
    import com.uuzuche.lib_zxing.activity.CaptureActivity;
    import com.uuzuche.lib_zxing.activity.CodeUtils;
    
    import org.greenrobot.eventbus.EventBus;
    
    public class FragmentOne extends Fragment implements View.OnClickListener{
    
        private static  String TAG = "dj";
    
        private ImageView image_qrcode;
        private Button btn_scan,btn_show;
        Bitmap mBitmap;
    
        private static int PERMISSION_REQUEST_CODE = 100;
        private static int REQUEST_CODE = PERMISSION_REQUEST_CODE + 1;
        private View view;
    
    
        @Nullable
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            view = inflater.inflate(R.layout.one, container, false);
            initView();
            return view;
        }
    
    
        private void initView() {
            image_qrcode = view.findViewById(R.id.image_qrcode);
            btn_scan = view.findViewById(R.id.btn_scan);
            btn_show = view.findViewById(R.id.btn_show);
    
            btn_scan.setOnClickListener(this);
            btn_show.setOnClickListener(this);
    
        }
    
        /**
         * 检测相机权限
         * @return
         */
        private boolean checkCameraPermission(){
            return PermissionChecker.checkSelfPermission(getActivity(),Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED;
        }
    
        /**
         * 请求相机权限
         */
        private void requestCameraPermission(){
            ActivityCompat.requestPermissions(getActivity(),new String[]{Manifest.permission.CAMERA},PERMISSION_REQUEST_CODE);
        }
    
        /**
         * 开启扫描
         */
        private void doScan(){
            Intent intent = new Intent(getActivity(), CaptureActivity.class);
            startActivityForResult(intent,REQUEST_CODE);
        }
    
        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if(requestCode == REQUEST_CODE){
                if(null != data){
                    Bundle bundle = data.getExtras();
                    if(bundle == null){
                        return;
                    }
                    if(bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_SUCCESS){
                        final String result = bundle.getString(CodeUtils.RESULT_STRING);
                        /*//事务管理器
                        FragmentManager manager = getActivity().getSupportFragmentManager();
                        //开启事务
                        FragmentTransaction transaction = manager.beginTransaction();
    
                        FragmentTwo fragmentTwo = new FragmentTwo();
                        Bundle bundle1 = new Bundle();
                        //传值
                        bundle1.putString("result",result);
    
                        fragmentTwo.setArguments(bundle1);
                        //替换
                        transaction.add(R.id.frame,fragmentTwo);
                        //提交
                        transaction.commit();*/
                        Log.i(TAG, getString(R.string.scan_result) + result);
                    }else if(bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_FAILED){
                        Log.e(TAG, getString(R.string.scan_error));
                    }
                }else {
                    Log.e(TAG, getString(R.string.scan_error));
                }
            }
        }
    
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            if(requestCode == PERMISSION_REQUEST_CODE && grantResults[0] == PackageManager.PERMISSION_GRANTED){
                doScan();
            }else {
                //权限被拒 根据需求  作不同处理
            }
        }
    
        @Override
        public void onClick(View v) {
            int id = v.getId();
            switch (id){
                case R.id.btn_scan:
                    EventBus.getDefault().post("我来了");
                    //检测相机权限
                    if(!checkCameraPermission()){
                        requestCameraPermission();
                    }else {
                        //允许的话
                        doScan();
    
                    }
                    break;
                case R.id.btn_show:
                    String textContext = "https://www.baidu.com/";
                    if(TextUtils.isEmpty(textContext)){
                        Toast.makeText(getActivity(),getString(R.string.show_qr_code_error),Toast.LENGTH_SHORT).show();
                        return;
                    }
                    mBitmap = CodeUtils.createImage(textContext,400,400,BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher));
                    image_qrcode.setImageBitmap(mBitmap);
                    break;
                    default:
            }
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
            if(mBitmap !=null){
                mBitmap.recycle();
            }
        }
    }
    

    接收

    package com.example.qrcode.fragment;
    
    import android.os.Bundle;
    import android.support.annotation.NonNull;
    import android.support.annotation.Nullable;
    import android.support.v4.app.Fragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.webkit.WebSettings;
    import android.webkit.WebView;
    import android.webkit.WebViewClient;
    import android.widget.Toast;
    
    import com.example.qrcode.R;
    
    import org.greenrobot.eventbus.EventBus;
    import org.greenrobot.eventbus.Subscribe;
    import org.greenrobot.eventbus.ThreadMode;
    
    public class FragmentTwo extends Fragment {
    
        private WebView two_webview;
    
        @Nullable
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.two, container, false);
            two_webview = view.findViewById(R.id.two_webview);
    
            /*try {
                String result = getArguments().getString("result");
    
                two_webview.loadUrl(result);
    
                WebSettings settings = two_webview.getSettings();
                settings.setJavaScriptCanOpenWindowsAutomatically(true);
                settings.setJavaScriptEnabled(true);
    
                two_webview.setWebViewClient(new WebViewClient());
            }catch (Exception e){
                e.printStackTrace();
            }*/
    
            return view;
        }
    
        @Override
        public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
            super.onViewCreated(view, savedInstanceState);
            //注册
            EventBus.getDefault().register(this);
        }
    
        @Subscribe(threadMode = ThreadMode.MAIN)
        public void Event(String messageEvent){
            Toast.makeText(getActivity(),messageEvent.toString(),Toast.LENGTH_SHORT).show();
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
            if(EventBus.getDefault().isRegistered(this)){
                EventBus.getDefault().unregister(this);
            }
        }
    }
    

     

    展开全文
  • QRcode

    千次阅读 2017-10-12 21:47:12
    android-zxingLibrary 二维码扫描和生成本文主要有两个内容 1.二维码是什么? 2.android项目中借助android-zxingLibrary快速实现二维码功能1.二维码是什么?参考博客地址: ...

    android-zxingLibrary 二维码扫描和生成


    本文主要有两个内容
    1.二维码是什么?
    2.android项目中借助android-zxingLibrary快速实现二维码功能


    1.二维码是什么?

    参考博客地址:
    http://blog.csdn.net/u012611878/article/details/53167009
    http://www.jianshu.com/p/f68a9d78d08e

          二维码,又称二维条码,它是用特定的几何图形按一定规律在平面(二维方向)上分布的黑白相间的图形。相比一维的条码,二维码能够在横向和纵向两个方位同时表达信息,因此能在很小的面积内表达大量的信息,同时可以有较高的容错能力。

    1.1 二维码的分类

    1.堆叠式/行排式二维条码

          堆叠式/行排式二维条码又称堆积式二维条码或层排式二维条码,其编码原理是建立在一维条码基础之上,按需要堆积成二行或多行。它在编码设计、校验原理、识读方式等方面继承了一维条码的一些特点,识读设备与条码印刷与一维条码技术兼容。但由于行数的增加,需要对行进行判定,其译码算法与软件也不完全相同于一维条码。有代表性的行排式二维条码有:Code 16K、Code 49、PDF417、MicroPDF417 等。

    2. 矩阵式二维码

          最流行莫过于QR CODE ,我们常说的二维码就是它了。矩阵式二维条码(又称棋盘式二维条码)它是在一个矩形空间通过黑、白像素在矩阵中的不同分布进行编码。在矩阵相应元素位置上,用点(方点、圆点或其他形状)的出现表示二进制“1”,点的不出现表示二进制的“0”,点的排列组合确定了矩阵式二维条码所代表的意义。矩阵式二维条码是建立在计算机图像处理技术、组合编码原理等基础上的一种新型图形符号自动识读处理码制。具有代表性的矩阵式二维条码有:Code One、MaxiCode、QR Code、 Data Matrix、Han Xin Code、Grid Matrix 等。
          二维码在现实生活中的应用越来越普遍由于QR CODE的流行,二维码又称QR code。

    1.2 QR码的特点

    • 1.存储大容量信息,相对于传统的条形码

    • 2.在小空间内打印,QR码使用纵向和横向两个方向处理数据,如果是相同的信息量,QR码所占空间为条形码的十分之一左右
    • 3.有效表现各种字母,日本国产的二维码,因此非常适合处理日文字母和汉字
    • 4.对变脏和破损的适应能力强,)即使部分编码变脏或破损,也可以恢复数据。数据恢复以码字为单位(是组成内部数据的单位,在QR码的情况下,每8比特代表1码字),最多可以纠错约30%(根据变脏和破损程度的不同,也存在无法恢复的情况
    • 5.可以从任意方向读取,QR码从360°任一方向均可快速读取。其奥秘就在于QR码中的3处定位图案

    • 6.支持数据合并功能,QR码可以将数据分割为多个编码,最多支持16个QR码

    1.3 QR码的编码过程

    1.数据分析:确定编码的字符类型,按相应的字符集转换成符号字符; 选择纠错等级,在规格一定的条件下,纠错等级越高其真实数据的容量越小。
    2.数据编码:将数据字符转换为位流,每8位一个码字,整体构成一个数据的码字序列。其实知道这个数据码字序列就知道了二维码的数据内容
    3.纠错编码:按需要将上面的码字序列分块,并根据纠错等级和分块的码字,产生纠错码字,并把纠错码字加入到数据码字序列后面,成为一个新的序列
    4.构造最终数据信息:在规格确定的条件下,将上面产生的序列按次序放如分块中。
    5.构造矩阵:将探测图形、分隔符、定位图形、校正图形和码字模块放入矩阵中。

    6.掩摸:将掩摸图形用于符号的编码区域,使得二维码图形中的深色和浅色(黑色和白色)区域能够比率最优的分布。
    7.格式和版本信息:生成格式和版本信息放入相应区域内。

    1.4 QBar识别和解码

    • 读取视频或图像,通过灰度化处理得到单张灰度图;
    • 对灰度图进行处理得到二值图像(二值化)
    • 将二值图输入不同的解码器识别是否存在二维码
    • 如果检测到存在某种编码,即通过相应的解码器进行解码,并返回解码结果

    1.5 总结

    二维码(QR)本质就是一个字符串,生成和扫描二维码的过程就是编码和解码。在这个过程中由于使用了效验所以导致二维码中内容是大于真实内容的。开始的二维码都是黑白图像,因为内容编码后是01序列,非常适合用二值图像显示;但是现在的可以是五颜六色的,这个也很好理解,白色还是1,其他的颜色都当成0就可以了

    2.android-zxingLibrary

    GitHub: https://github.com/yipianfengye/android-zxingLibrary
    作者博客地址 : http://blog.csdn.net/qq_23547831/article/details/52037710?reload

    2.1 主要几个常用的功能

    • 扫描二维码
    • 生成二维码
    • 从本地读取图片扫描(在实践过程中有点问题,没有实现,但是不影响这个库的强大)
    • 扫描二维码界面的UI改变(没有实践)

    2.2 使用方式

    2.1 gradle依赖

        compile 'cn.yipianfengye.android:zxing-library:2.2'

    2.2 权限申请 , 相机,震动等

    <uses-permission android:name="android.permission.CAMERA" />
    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.FLASHLIGHT" />

    2.3使用

    1.扫描
     //扫描二维码
            findViewById(R.id.btn_scan).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Intent intent = new Intent(MainActivity.this , CaptureActivity.class);
                    startActivityForResult(intent , SCAN);
                }
            });
    
    
      @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            if(requestCode == SCAN){
                if(data != null){
                    Bundle bundle = data.getExtras();
                    if(bundle == null){
                        Log.e(TAG, "onActivityResult: "+ "error" );
                    }
                    if(bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_SUCCESS){
                        String result = bundle.getString(CodeUtils.RESULT_STRING);
                        Toast.makeText(this, result, Toast.LENGTH_SHORT).show();
                    }else if(bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_FAILED){
                        Toast.makeText(this, "error", Toast.LENGTH_SHORT).show();
                    }
                }
        }
    
    2.生成二维码
     findViewById(R.id.btn_create).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    String content = et.getText().toString();
                    if(TextUtils.isEmpty(content)){
                        Toast.makeText(MainActivity.this, "输入为null", Toast.LENGTH_SHORT).show();
                        return;
                    }
                    et.setText("");
                    iv.setImageBitmap(CodeUtils.createImage(content , 400 , 400 , null));
                }
            });
    展开全文
  • QRCode的用法

    万次阅读 2021-02-04 16:16:36
    QRCode的用法 一、QRCode是什么? QRCode.js 是一个用于生成二维码的 JavaScript 库。主要是通过获取 DOM 的标签,再通过 HTML5 Canvas 绘制而成,不依赖任何库。 二、使用步骤 qrcode.min.js下载 1.引入qrcode.min.js...

    QRCode的用法

    一、QRCode是什么?

    QRCode.js 是一个用于生成二维码的 JavaScript 库。主要是通过获取 DOM 的标签,再通过 HTML5 Canvas 绘制而成,不依赖任何库。

    二、使用步骤

    qrcode.min.js下载

    1.引入qrcode.min.js

    用法1:

    <div id="qrcode"></div>
    <script type="text/javascript">
    new QRCode(document.getElementById("qrcode"), "http://www.runoob.com");	//要生成二维码的链接
    </script>
    

    用法2:

    var qrcode = new QRCode("test", {
        text: "http://www.runoob.com",	//要生成二维码的链接
        width: 128,	//二维码的宽度
        height: 128,	//二维码的高度
        colorDark : "#000000",	//前景色
        colorLight : "#ffffff",	//背景色
        correctLevel : QRCode.CorrectLevel.H	//纠错等级
    });
    

    用法3:

    qrcode.makeCode("http://www.w3cschool.cc"); //要生成二维码的链接
    

    纠错等级

    二维码容错率即是指二维码图标被遮挡多少后,仍可以被扫描出来的能力。容错率越高,则二维码图片能被遮挡的部分越多。

    容错的原理是二维码在编码过程中进行了冗余,就像是123被编码成123123,这样只要扫描到一部分二维码图片,二维码内容还是可以被全部读到。

    大多数情况下,我们强烈建议采用30%的容错率(对目前主流手机,在绝大多数扫描场景下,容错率越高,越容易被快速扫描!!!)

    correctLevel : QRErrorCorrectLevel.L, (7%)
    correctLevel : QRErrorCorrectLevel.M, (15%)
    correctLevel : QRErrorCorrectLevel.Q, (25%)
    correctLevel : QRErrorCorrectLevel.H, (30%)

    展开全文
  • C# 利用QRCode生成二维码图片

    万次阅读 多人点赞 2014-01-18 10:04:30
    网上生成二维码的组件是真多,可是真正好用的,并且生成速度很快的没几个,QRCode就是我在众多中找到的,它的生成速度快。但是网上关于它的使用说明,真的太少了,大都是千篇一律的复制粘贴。这是本要用它做了一个...
  • 生成QRCodeQRCode源代码
  • 二维码支持jar包,qrcode.jar和qrcode_swetake.jar 二维码支持jar包,qrcode.jar和qrcode_swetake.jar
  • qrcode_swetake+qrcodejar.zip

    2020-11-02 08:17:42
    qrcode_swetake.jar、qrcode.jar两jar包 很好的java实现二维码([带]logo)的绘制和解析(qrcode)
  • QRCode.zip

    2020-08-30 15:19:17
    使用Java中的QRcode方式生成二维码,maven官网没有QRcode jar,提供一份QRcode的 jar文件
  • homekit qrcode

    2020-12-09 03:06:11
    and re-generate the qrcode, but when I scan the qrcode by iphone homekit app, it prompt the device has already added, like "配件已添加" I just bind the sample qrcode before and deleted the ...
  • qrcode.js(QRCode for JavaScript)是一个用于生成二维码的 JavaScript 库。主要是通过获取 DOM 的标签,再通过 HTML5 Canvas 绘制而成,不依赖任何库。
  • qrcode _jar

    2019-04-08 10:43:51
    qrcode jar
  • QRCodeQrcode_swetake二维码jar,也可以直接下载仓库文件,解压直接放进仓库,复制链接下载 https://download.csdn.net/download/qq_33705529/10531558
  • 用Swift编写的QRCode生成器。 总览 创建一个表示URL ,字符串或任意数据的新QRCode。 以下示例均产生相同的QRCode图像。 // URL let url = URL ( string : " http://schuch.me " ) ! let qrCode = QRCode (url) ...
  • jquery.qrcode.js 是一个纯 qrcode 浏览器的 jquery 插件,使用这款插件,你可以轻松地在你的网页中添加 qrcode 。它是独立的,经过 minify gzip 压缩后,大小小于4 k,不需要下载任何图片。关闭或打开时,它不依赖...
  • qrCode.rar

    2020-07-18 08:45:54
    qrcode.jar Qrcode_swetake.jar 包下载,包含maven打入本地仓库的命令;
  • Qrcode.jar

    2021-01-09 22:42:20
    Qrcode.jar 用于二维码的生成
  • qrcode.zip

    2020-04-28 20:58:26
    使用qrcode,根据后台返回链接,生成一个可以访问的二维码使用qrcode,根据后台返回链接,生成一个可以访问的二维码使用qrcode,根据后台返回链接,生成一个可以访问的二维码
  • qrcode.rar

    2020-06-24 16:38:44
    使用angular 生成二维码示例 ,分别使用了qrcode 和 angular2-qrcode 两种方法生成的示例,可以参考进行项目开发使用
  • qrcode二维码组件

    2020-02-25 09:18:00
    qrcode二维码组件,qrcode.min.js依靠jQuery 示例代码: $("#qrcode").qrcode({ render : "canvas", //设置渲染方式,有table和canvas text : '', //扫描二维码后自动跳向该链接 width : "300", //二维码的宽度...
  • QRCode.jar

    2020-08-12 23:05:16
    QRcode是一种矩阵二维码符号,它具有一维条码及其它二维条码所具有的信息容量大、可靠性高、可表示汉字及图象多种文字信息、保密防伪性强等优点。可以使用QRCode.jar生成与解析二维码。
  • QRCode+Qrcode_swetake 解压直接放进仓库即可。下载直用。
  • QRCode Demo

    2014-12-11 03:26:24
    包含QRCode.jar的QRCodeDemo,可以添加个性logo
  • FastReport QRCode

    热门讨论 2013-06-19 09:13:27
    让你的 FastReport 支持 QRCode 二维码
  • jquery.qrcode.js jquery.qrcode.js is jquery plugin for a pure browser qrcode generation. It allow you to easily add qrcode to your webpages. It is standalone, less than 4k after minify+gzip, no image ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,443
精华内容 4,177
关键字:

qrcode