二维码和条形码简单实现

现在有很多精修的第三方的zxing,本次试用的是慕课网的libzxing,然后自己又添加了条形码的生成的内容。

/**
 * 条形码
 */
public class Ecoad {

    private int width;
    private int height;
    public Ecoad(int width,int height){
        this.width=width;
        this.height=height;
    }

    //绘制条形码
    public Bitmap bitmap1(String ss) throws Exception{
        //条形码CODE_128
        BarcodeFormat fomt=BarcodeFormat.CODE_128;
        BitMatrix matrix=new MultiFormatWriter().encode(ss, fomt, width, height);
        int width=matrix.getWidth();
        int height=matrix.getHeight();
        int[] pixel=new int[width*height];
        for(int i=0;i<height;i++){
            for(int j=0;j<width;j++){
                if(matrix.get(j,i))
                    pixel[i*width+j]=0xff000000;
            }
        }
        Bitmap bmapp=Bitmap.createBitmap(width,height,Bitmap.Config.ARGB_8888);
        bmapp.setPixels(pixel, 0, width, 0, 0, width, height);
        return bmapp;
    }
}
zxing里的一个类
/**
 * 二维码生成工具类
 */
public class EncodingUtils {

    /**
     * 创建二维码
     *
     * @param content   content
     * @param widthPix  widthPix
     * @param heightPix heightPix
     * @param logoBm    logoBm
     * @return 二维码
     */
    public static Bitmap createQRCode(String content, int widthPix, int heightPix, Bitmap logoBm) {
        try {
            if (content == null || "".equals(content)) {
                return null;
            }
            // 配置参数
            Map<EncodeHintType, Object> hints = new HashMap<>();
            hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
            // 容错级别
            hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
            // 图像数据转换,使用了矩阵转换
            BitMatrix bitMatrix = new QRCodeWriter().encode(content, BarcodeFormat.QR_CODE, widthPix,
                    heightPix, hints);
            int[] pixels = new int[widthPix * heightPix];
            // 下面这里按照二维码的算法,逐个生成二维码的图片,
            // 两个for循环是图片横列扫描的结果
            for (int y = 0; y < heightPix; y++) {
                for (int x = 0; x < widthPix; x++) {
                    if (bitMatrix.get(x, y)) {
                        pixels[y * widthPix + x] = 0xff000000;
                    } else {
                        pixels[y * widthPix + x] = 0xffffffff;
                    }
                }
            }
            // 生成二维码图片的格式,使用ARGB_8888
            Bitmap bitmap = Bitmap.createBitmap(widthPix, heightPix, Bitmap.Config.ARGB_8888);
            bitmap.setPixels(pixels, 0, widthPix, 0, 0, widthPix, heightPix);
            if (logoBm != null) {
                bitmap = addLogo(bitmap, logoBm);
            }
            //必须使用compress方法将bitmap保存到文件中再进行读取。直接返回的bitmap是没有任何压缩的,内存消耗巨大!
            return bitmap;
        } catch (WriterException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 在二维码中间添加Logo图案
     */
    private static Bitmap addLogo(Bitmap src, Bitmap logo) {
        if (src == null) {
            return null;
        }
        if (logo == null) {
            return src;
        }
        //获取图片的宽高
        int srcWidth = src.getWidth();
        int srcHeight = src.getHeight();
        int logoWidth = logo.getWidth();
        int logoHeight = logo.getHeight();
        if (srcWidth == 0 || srcHeight == 0) {
            return null;
        }
        if (logoWidth == 0 || logoHeight == 0) {
            return src;
        }
        //logo大小为二维码整体大小的1/5
        float scaleFactor = srcWidth * 1.0f / 5 / logoWidth;
        Bitmap bitmap = Bitmap.createBitmap(srcWidth, srcHeight, Bitmap.Config.ARGB_8888);
        try {
            Canvas canvas = new Canvas(bitmap);
            canvas.drawBitmap(src, 0, 0, null);
            canvas.scale(scaleFactor, scaleFactor, srcWidth / 2, srcHeight / 2);
            canvas.drawBitmap(logo, (srcWidth - logoWidth) / 2, (srcHeight - logoHeight) / 2, null);
            canvas.save(Canvas.ALL_SAVE_FLAG);
            canvas.restore();
        } catch (Exception e) {
            bitmap = null;
            e.getStackTrace();
        }
        return bitmap;
    }
}
public class MainActivity extends AppCompatActivity {

    private Button scan_Btn;

    private TextView result_TexView;

    private EditText input_EditText;
    private ImageView image;

    private CheckBox check_Logo;

    private TextView show_text;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        scan_Btn = (Button)findViewById(R.id.scan_btn);
        result_TexView = (TextView)findViewById(R.id.scan_result);
        input_EditText = (EditText)findViewById(R.id.make_edit) ;
        image = (ImageView)findViewById(R.id.image_set) ;
        check_Logo = (CheckBox)findViewById(R.id.check_logo);
        show_text = (TextView)findViewById(R.id.show_text);


        scan_Btn.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {

                startActivityForResult(new
                        Intent(MainActivity.this, CaptureActivity.class),0);


            }
        });

    }

    /**
     * 生成条形码
     * @param view
     */
    public void make_txm(View view){

        String input = input_EditText.getText().toString();

        if(input.equals("")){

            Toast.makeText(MainActivity.this, "输入的内容为空,请重新输入", Toast.LENGTH_SHORT).show();

        }else if (isAllDig(input)){

            Toast.makeText(MainActivity.this, "输入的内容不能包括中文,请重新输入", Toast.LENGTH_SHORT).show();

        }else{

            Ecoad ecoad = new Ecoad(700, 500);

            try {
                Bitmap bitmap = ecoad.bitmap1(input);
                image.setImageBitmap(bitmap);
                show_text.setText(input);
                show_text.setVisibility(View.VISIBLE);

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

            }



        }


    }

    public boolean isAllDig(String input){

        for (int i=0;i<input.length();i++){
            int c = input.charAt(i);

            if(c>19968 && c<40623){   //中文范围
                return true;
            }
        }

       return  false;

    }

    public void make_btn(View view){

        String input = input_EditText.getText().toString();

        if(input.equals("")){
            Toast.makeText(MainActivity.this, "输入为空,请重新输入", Toast.LENGTH_SHORT).show();
        }else{

            Bitmap bitmap = EncodingUtils.createQRCode(input,700,700,
                    check_Logo.isChecked()? BitmapFactory.decodeResource(getResources(),R.drawable.myshow):null);
            show_text.setVisibility(View.INVISIBLE);
            image.setImageBitmap(bitmap);
        }




    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if(resultCode==RESULT_OK){

            Bundle bundle = data.getExtras();

            final String result = bundle.getString("result");//CaptureActivity中的key为“result”

            result_TexView.setText(result);
            //如果扫描的为一个网址,那么则访问
            if(result.startsWith("http://")){

                AlertDialog.Builder dialog = new AlertDialog.Builder(this);

                dialog.setTitle("扫描结果如下,是否访问该网址?");
                dialog.setMessage(result);


                dialog.setNegativeButton("确定", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        // 用默认浏览器打开扫描得到的地址
                        Intent intent = new Intent();
                        intent.setAction("android.intent.action.VIEW");
                        Uri content_url = Uri.parse(result);
                        intent.setData(content_url);
                        startActivity(intent);
                        finish();
                    }
                });
                dialog.setPositiveButton("取消", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
//                        finish();
                    }
                });

                dialog.create().show();
            }

        }
    }

}

效果如下:
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值