二维码的生成与解析

来源:互联网 发布:编程游戏 编辑:程序博客网 时间:2024/05/14 12:23

二维码的生成与解析

二维码的原理简介:二维码 (2-dimensional bar code),是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的。二维码中的黑白色表示二进制的0和1,所以信息可以通过一定的编码方式,将信息编入进二维码中。二维码具有多种编码,常用的有:PDF417、QR Code、Code 49、Code 16K、Code One等。

这里写图片描述


效果图

这里写图片描述

以下是二维码生成代码:

界面布局

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:padding="16dp"    android:orientation="vertical"    tools:context="www.weshared.demo2.MainActivity">    <EditText        android:id="@+id/edit_url"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:hint="输入信息" />    <Button        android:id="@+id/btn_get_erweima"        android:layout_width="match_parent"        android:text="生成二维码"        android:layout_height="wrap_content" />    <ImageView        android:layout_marginTop="100dp"        android:layout_gravity="center"        android:id="@+id/iv_erweima"        android:layout_width="200dp"        android:layout_height="200dp" /></LinearLayout>

MainActivity中代码

public class MainActivity extends AppCompatActivity implements View.OnClickListener, View.OnLongClickListener {    private EditText editText;    private Button btn;    private ImageView imageView;    private boolean isShow;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        init();        initListener();    }    private void init() {        editText = (EditText) findViewById(R.id.edit_url);        btn = (Button) findViewById(R.id.btn_get_erweima);        imageView = (ImageView) findViewById(R.id.iv_erweima);    }    private void initListener() {        btn.setOnClickListener(this);        imageView.setOnLongClickListener(this);    }    @Override    public void onClick(View view) {        switch (view.getId()) {            case R.id.btn_get_erweima:                getErWeiMa();                isShow = true;                break;        }    }    @Override    public boolean onLongClick(View view) {        scanErWeiMa();        return true;    }    private void scanErWeiMa() {        if (isShow) {            BitmapDrawable drawable = (BitmapDrawable) imageView.getDrawable();            Bitmap bitmap = drawable.getBitmap();            int w = bitmap.getWidth();            int h = bitmap.getHeight();            int[] row = new int[w * h];            bitmap.getPixels(row, 0, w, 0, 0, w, h);//获取bitmap的像素点            Hashtable<DecodeHintType, String> table = new Hashtable<>();            table.put(DecodeHintType.CHARACTER_SET, "utf-8");//设置编码格式            QRCodeReader reader = new QRCodeReader();            BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(new RGBLuminanceSource(w, h, row)));            try {                Result result = reader.decode(binaryBitmap, table);                String content = result.getText();                Toast.makeText(getApplicationContext(), content, Toast.LENGTH_SHORT).show();            } catch (NotFoundException e) {                e.printStackTrace();            } catch (ChecksumException e) {                e.printStackTrace();            } catch (FormatException e) {                e.printStackTrace();            }        }    }    public void getErWeiMa() {        String content = editText.getText().toString().trim();        if (TextUtils.isEmpty(content)) return;        Bitmap bitmap = createErWeiMa(content);        if (bitmap == null) return;        imageView.setImageBitmap(bitmap);    }    private Bitmap createErWeiMa(String content) {        QRCodeWriter writer = new QRCodeWriter();        try {            BitMatrix matrix = writer.encode(content,                    BarcodeFormat.QR_CODE, //二维码的编码格式,与‘QRCodeWriter’对应                    imageView.getMeasuredWidth(),                    imageView.getMeasuredHeight());            return matrixChangeBitmap(matrix);        } catch (WriterException e) {            e.printStackTrace();        }        return null;    }    private Bitmap matrixChangeBitmap(BitMatrix matrix) {        if (matrix == null) throw new NullPointerException("matrix is null");        int width = matrix.getWidth();        int height = matrix.getHeight();        int[] row = new int[width * height];        for (int i = 0; i < width; i++) {            for (int j = 0; j < height; j++) {                int color = Color.WHITE;                if (matrix.get(i, j)) {                    color = Color.BLACK;                }                row[i + j * width] = color;            }        }        Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);        bitmap.setPixels(row, 0, width, 0, 0, width, height);        return bitmap;    }}
0 0
原创粉丝点击