zoukankan      html  css  js  c++  java
  • 二维码的生成

    1、ZXing库介绍

      这里简单介绍一下ZXing库。ZXing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口。Zxing可以实现使用手机的内置的摄像头完成条形码的扫描及解码。该项目可实现的条形码编码和解码。目前支持以下格式:UPC-A,UPC-E、EAN-8,EAN-13、39码、93码。ZXing是个很经典的条码/二维码识别的开源类库,以前在功能机上,就有开发者使用J2ME运用ZXing了,不过要支持JSR-234规范(自动对焦)的手机才能发挥其威力。

    2、ZXing库主要类

      下面给大家介绍一下,ZXing库里面主要的类以及这些类的作用:

    • CaptureActivity。这个是启动Activity 也就是扫描器。
    • CaptureActivityHandler 解码处理类,负责调用另外的线程进行解码。
    • DecodeThread 解码的线程。
    • com.google.zxing.client.android.camera 包,摄像头控制包。
    • ViewfinderView 自定义的View,就是我们看见的拍摄时中间的框框了。

    1:首先下载一个谷歌的ZXing的二维码jar包

    2:我们可以去http://code.google.com/p/zxing/下载源码和Jar包

    //--------------xml布局文件-------------------

    <ImageView android:layout_width="300dp"
            android:layout_height="300dp"
            android:id="@+id/qr_image"/>

    //------------------MainActivity中-----------------------------------

    private int QR_WIDTH=400;
     private int QR_HEIGHT=400;

    private ImageView qr_image;

    //只需要把URL改一下就行了

    private String url="http://www.baidu.com";

     @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
         
            qr_image = (ImageView) findViewById(R.id.qr_image);
           
            createQRImage(url);
           
        }

    //----------实现--createQRImage(url)方法--------------------

    //要转换的地址或字符串,可以是中文
        public void createQRImage(String url) {
            try
            {
                //判断URL合法性
                if (url == null || "".equals(url) || url.length() < 1)
                {
                    return;
                }
                Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();
                hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
                //图像数据转换,使用了矩阵转换
                BitMatrix bitMatrix = new QRCodeWriter().encode(url, BarcodeFormat.QR_CODE, QR_WIDTH, QR_HEIGHT, hints);
                int[] pixels = new int[QR_WIDTH * QR_HEIGHT];
                //下面这里按照二维码的算法,逐个生成二维码的图片,
                //两个for循环是图片横列扫描的结果
                for (int y = 0; y < QR_HEIGHT; y++)
                {
                    for (int x = 0; x < QR_WIDTH; x++)
                    {
                        if (bitMatrix.get(x, y))
                        {
                            pixels[y * QR_WIDTH + x] = 0xff000000;
                        }
                        else
                        {
                            pixels[y * QR_WIDTH + x] = 0xffffffff;
                        }
                    }
                }
                //生成二维码图片的格式,使用ARGB_8888
                Bitmap bitmap = Bitmap.createBitmap(QR_WIDTH, QR_HEIGHT, Bitmap.Config.ARGB_8888);
                bitmap.setPixels(pixels, 0, QR_WIDTH, 0, 0, QR_WIDTH, QR_HEIGHT);
                //显示到一个ImageView上面
                qr_image.setImageBitmap(bitmap);
            }
            catch (WriterException e)
            {
                e.printStackTrace();
            }
        }

    //----------------------第二种输入框输内容------------------------------------------------

          找到控件

      qr_text = (EditText) findViewById(R.id.qr_text);
            qr_image = (ImageView) findViewById(R.id.qr_image);
            bt_button = (Button) findViewById(R.id.bt_button);
            bt_button.setOnClickListener(this);

    // 生成QR图
        private void createImage() {
            try {
                // 需要引入core包
                QRCodeWriter writer = new QRCodeWriter();

                String text = qr_text.getText().toString();

                Log.i("--------------", "生成的文本:" + text);
                if (text == null || "".equals(text) || text.length() < 1) {
                    return;
                }

                // 把输入的文本转为二维码
                BitMatrix martix = writer.encode(text, BarcodeFormat.QR_CODE,
                        QR_WIDTH, QR_HEIGHT);

                System.out.println("w:" + martix.getWidth() + "h:"
                        + martix.getHeight());

                Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();
                hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
                BitMatrix bitMatrix = new QRCodeWriter().encode(text,
                        BarcodeFormat.QR_CODE, QR_WIDTH, QR_HEIGHT, hints);
                int[] pixels = new int[QR_WIDTH * QR_HEIGHT];
                for (int y = 0; y < QR_HEIGHT; y++) {
                    for (int x = 0; x < QR_WIDTH; x++) {
                        if (bitMatrix.get(x, y)) {
                            pixels[y * QR_WIDTH + x] = 0xff000000;
                        } else {
                            pixels[y * QR_WIDTH + x] = 0xffffffff;
                        }

                    }
                }

                Bitmap bitmap = Bitmap.createBitmap(QR_WIDTH, QR_HEIGHT,
                        Bitmap.Config.ARGB_8888);

                bitmap.setPixels(pixels, 0, QR_WIDTH, 0, 0, QR_WIDTH, QR_HEIGHT);
                qr_image.setImageBitmap(bitmap);

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


        
        @Override
        public void onClick(View v) {
             createImage();
            
        }

  • 相关阅读:
    Feign调用文件上传服务接口样例
    Feign调用文件下载服务接口样例
    使用Spring Security的Basic Auth认证后Postman的POST请求不成功的可能原因
    Spring Boot应用的Controller返回的集合类数据是XML格式的可能原因
    Eureka Server增加Spring Security后的服务端和客户端配置
    Spring Data支持的关键字
    JPA(Hibernate)代理类的hibernateLazyInitializer属性系列化异常
    Spring Boot中fastjson的@JSONField(format = "yyyy-MM-dd HH:mm:ss")失效可能原因
    使用Java代码配置MyBatis Generator
    CentOS8.1中搭建Nexus3服务器
  • 原文地址:https://www.cnblogs.com/changyiqiang/p/5757163.html
Copyright © 2011-2022 走看看