精华内容
下载资源
问答
  • 二维码框架

    2018-08-01 17:08:27
    参考:https://blog.csdn.net/javaandroid730/article/details/53385749
    展开全文
  • 这个二维码框架不仅使用的代码少,而且可以生成带图片的二维码,而且二维码扫描界面也是先做好的,也比较好看。我们所需要做的就是在扫描二维码后得到的数据对其进行操作。 使用方法 添加依赖 compile '...
  • Android 二维码框架之Zxing实现二维码扫描功能     1、ZXing库介绍  这里简单介绍一下ZXing库。ZXing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口。Zxing...

    前篇介绍了ZXing开源框架的使用,此篇接着讲解一些ZXing的知识并使用ZXing生成二维码

     

    Android 二维码框架之Zxing实现二维码扫描功能

     

     

    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库主要类

    CaptureActivity。这个是启动Activity 也就是扫描器。


    CaptureActivityHandler 解码处理类,负责调用另外的线程进行解码。


    DecodeThread 解码的线程。


    com.google.zxing.client.android.camera 包,摄像头控制包。


    ViewfinderView 自定义的View,就是我们看见的拍摄时中间的框框了。

     

     

     

    3.生成二维码

     

    代码

    public class ShowQrCodeActivity extends BaseActivity implements View.OnClickListener{
    
        private RelativeLayout backlayout;
        private TextView titletextview;
        private ImageView imageview;
        private Bitmap bitmap;
        private Bitmap logobitmap;
        private PopupWindow saveimg_ppw;//自定义保存图片PPW
        private Button savebtn;//保存图片
        private Button cancalbtn;//取消
        private ToastUtils toast;
        private AlertDialog alertDialog;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_showqrcode);
            initView();
        }
    
        /**
         * 初始化各种view方法
         * */
    
        private void initView(){
            toast=new ToastUtils(this);
            backlayout= (RelativeLayout) findViewById(R.id.apptoplayout_onlyback_backlayout);
            titletextview= (TextView) findViewById(R.id.apptoplayout_onlyback_titletextview);
            backlayout.setOnClickListener(this);
            imageview= (ImageView) findViewById(R.id.activity_showqrcode_imageview);
            titletextview.setText(R.string.activity_showqrcodetextview1);
            imageview.setOnClickListener(this);
            //二维码Logo
            logobitmap=BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
            if(null!=logobitmap){
                if(FileHelper.isSdCardExist()){
                    createQRImage(StringConstant.CliniciansQrCodeUrl,logobitmap);
                }else{
                    toast.showToast(StringConstant.Filestatus2);
                }
            }
        }
    
        /**
         * 生成二维码
         * */
    
        private void createQRImage(final String url,final Bitmap logobitmap){
            
        }
    
        /**
         * 保存二维码文件存储根目录
         * */
    
        private String getFileRoot(Context context) {
            if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
                File external = context.getExternalFilesDir(null);
                if (external != null) {
                    return external.getAbsolutePath();
                }
            }
            return context.getFilesDir().getAbsolutePath();
        }
    
        /**
         * 各种点击事件的方法
         * */
    
        @Override
        public void onClick(View v) {
            switch (v.getId()){
                case R.id.apptoplayout_onlyback_backlayout://返回操作
                    backPPW();
                    break;
                case R.id.activity_showqrcode_imageview://显示PPW
                    requestAndroidPermission();
                    break;
                case R.id.saveimagepopuview_savebtn://保存图片
                    if (null != imageview) {
                        imageview.setDrawingCacheEnabled(true);
                        bitmap = Bitmap.createBitmap(imageview.getDrawingCache());
                        imageview.setDrawingCacheEnabled(false);
                        String strPath =UUID.randomUUID().toString()+".png";
                        FileOutputStream fos = null;
                        try {
                            File file = new File(FileHelper.getTheRootDirectory() + StringConstant.PICTURESAVE_Path);
                            if (!file.exists()) {
                                file.mkdirs();
                            }
                            fos = new FileOutputStream(FileHelper.getTheRootDirectory()+ StringConstant.PICTURESAVE_Path+strPath);
                            //当指定压缩格式为PNG时保存下来的图片显示正常
                            bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
                            //当指定压缩格式为JPEG时保存下来的图片背景为黑色
                            //bitmap.compress(CompressFormat.JPEG, 100, fos);
                            fos.flush();
                        } catch (Exception e) {
                            e.printStackTrace();
                        } finally {
                            try {
                                fos.close();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                        toast.showToast(StringConstant.followformstatus24);
                    } else {
                        toast.showToast(StringConstant.followformstatus241);
                    }
                    dismissPpw();
                    break;
                case R.id.saveimagepopuview_cancalbtn://取消
                    dismissPpw();
                    break;
            }
        }
    
        /**
         * Android 6.0系统及以上申请敏感权限方法
         * */
    
        private void requestAndroidPermission(){
            if(FileHelper.isSdCardExist()){
                if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){//6.0
                    boolean has= AndroidPermissionUtils.hasAndroidPermission(ShowQrCodeActivity.this, DataConstant.permission);
                    if(!has){//6.0及以上 没有权限
                        AndroidPermissionUtils.requestAndroidPermission(ShowQrCodeActivity.this,0,DataConstant.permission);
                    }else{//6.0及以上 有权限 操作文件
                        getSavePopupWindowInstance();
                        saveimg_ppw.showAtLocation(this.findViewById(R.id.activity_showqrcode_fatherlayout), Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0,0);
                    }
                }else{//6.0以下 操作文件
                    getSavePopupWindowInstance();
                    saveimg_ppw.showAtLocation(this.findViewById(R.id.activity_showqrcode_fatherlayout), Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0,0);
                }
            }else{
                toast.showToast(StringConstant.Filestatus2);
            }
        }
    
        /**
         * onRequestPermissionsResult 动态申请回调方法
         * */
    
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            if(grantResults.length > 0 && !(grantResults[0] == PackageManager.PERMISSION_GRANTED)){
                showDialogs("温馨提示",StringConstant.errorstate6);
            }
        }
    
        /**
         * 显示提示对话框
         */
    
        public void showDialogs(final String title,final String msg) {
            if(!ActivityUtils.isActivityIsAlive(this)){
                return;
            }
            alertDialog=new AlertDialog.Builder(this).create();
            alertDialog.show();
            alertDialog.setCancelable(false);//点击外部 对话框不消失
            Window window=alertDialog.getWindow();
            window.setContentView(R.layout.dialog_informations);
            TextView titletv= (TextView) window.findViewById(R.id.dialog_informations_titletv);
            titletv.setText(title);
            //显示内容
            TextView contexttv = (TextView) window.findViewById(R.id.dialog_informations_contexttv);
            contexttv.setText(msg);
            //确定
            TextView suretv=(TextView) window.findViewById(R.id.dialog_informations_surelv);
            suretv.setOnClickListener(new View.OnClickListener() {
    
                @Override
                public void onClick(View arg0) {
                    alertDialog.dismiss();
                }
            });
        }
    
        /**
         * 获取自定义保存图片PPW对象的方法
         * */
    
        public void getSavePopupWindowInstance(){
            if(saveimg_ppw!=null){
                saveimg_ppw.dismiss();//隐藏保存图片PPW
            }else{
                initSavePopuptWindow();//创建保存图片PPW
            }
        }
    
        /**
         * 创建自定义选择头像保存图片PPW对象的方法
         * */
    
        public void initSavePopuptWindow(){
            View userView=View.inflate(this,R.layout.saveimagepopupview,null);
            savebtn=(Button) userView.findViewById(R.id.saveimagepopuview_savebtn);
            cancalbtn=(Button) userView.findViewById(R.id.saveimagepopuview_cancalbtn);
            savebtn.setOnClickListener(this);
            cancalbtn.setOnClickListener(this);
    
            /**
             * 创建一个PopupWindow
             * 参数1:contentView 指定PopupWindow的内容
             * 参数2:width 指定PopupWindow的width
             * 参数3:height 指定PopupWindow的height
             * */
    
            saveimg_ppw=new PopupWindow(userView, ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT);
            //这2行是为了当点击外部时候popupWindow自己dismiss掉
            saveimg_ppw.setBackgroundDrawable(new BitmapDrawable());
            saveimg_ppw.setOutsideTouchable(true);
            //设置SelectPicPopupWindow弹出窗体动画效果
            saveimg_ppw.setAnimationStyle(R.style.AnimBottomss);
            //实例化一个ColorDrawable颜色为半透明
            ColorDrawable dw = new ColorDrawable(0xb0000000);
            //设置SelectPicPopupWindow弹出窗体的背景
            saveimg_ppw.setBackgroundDrawable(dw);
        }
    
        /**
         * 隐藏PPW对象的方法
         * */
    
        public void dismissPpw(){
            if(saveimg_ppw!=null){
                saveimg_ppw.dismiss();
            }
        }
    
        /**
         * 返回时操作ppw
         * */
    
        public void backPPW(){
            if(saveimg_ppw!=null){
                if(saveimg_ppw.isShowing()){
                    saveimg_ppw.dismiss();
                }else{
                    finish();
                    overridePendingTransition(0,R.anim.activity_right_open);
                }
            }else{
                finish();
                overridePendingTransition(0,R.anim.activity_right_open);
            }
        }
    
        /**
         * onDestroy方法
         * */
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            ImageViewCachUtils.releaseBitmap(bitmap);
            ImageViewCachUtils.releaseBitmap(logobitmap);
            if(null!=alertDialog){//隐藏对话框
                alertDialog.dismiss();
            }
        }
    
        /**
         * onKeyDown方法
         * */
    
        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_BACK) {
                backPPW();
                return false;
            }
            return super.onKeyDown(keyCode, event);
        }
    
    }

     

    完整项目代码:https://github.com/wujianning/QrCode

    展开全文
  • 二维码框架Zxing的使用及自定义

    万次阅读 多人点赞 2018-06-19 21:58:04
    在开始介绍之前,我先说一下我的使用情况吧,网上的博客里面基本上都把Zxing框架自己封装了,或者在教程中需要添加library然后修改源文件。否则你就无法自定义ZXing,并且你还会遇到某些问题——比如二维码扫描图片...

    项目需要一个二维码扫描功能

    image

    关于二维码的扫描,我之前就听说过ZXing了(虽然从来没用过)

    所以既然这次要用它了,自然是得搜索一番资料咯。

    在开始介绍之前,我先说一下我的使用情况吧,网上的博客里面基本上都把Zxing框架自己封装了,或者在教程中需要添加library然后修改源文件。否则你就无法自定义ZXing,并且你还会遇到某些问题——比如二维码扫描图片是横屏的。

    幸运的是这些问题我都遇到了!!!

    image

    还好,我花了几个小时,终于是解决了上面这些问题,不用更改源码,也是可以对二维码扫描页面自定义的。

    首先,贴上ZXing的android端GitHub地址:

    zxing-android-embedded

    好吧,接下来就开始介绍如何使用了。

    一、ZXing框架的集成

    在你的项目的根目录下的build.gradle中需要配置这个:

    repositories {
        jcenter()
    }

    然后是app目录下的build.gradle,配置如下:

    dependencies {
        compile('com.journeyapps:zxing-android-embedded:3.6.0') { transitive = false }
        compile 'com.android.support:appcompat-v7:25.3.1'   //如果V7已经配置过,那就不要重复添加了
        compile 'com.google.zxing:core:3.3.0'
    }

    下面在AndroidManifest.xml中添加,表示开启硬件加速,其实没必要,因为一般硬件加速都是默认开启的

      <application android:hardwareAccelerated="true" ... >

    二、ZXing框架的使用

    配置完成后就可以使用了。

    使用的方式非常简单,在github的说明文档中,仅仅需要一行代码就可以打开二维码的扫描界面了:

    new IntentIntegrator(this).initiateScan();

    可以在一个Button的点击事件中添加这行代码,然后你只需要在当前的Activity中重写onActivityResult去获取结果就ok了。

    不过。。。

    image

    如果你以为事情真的那么简单那你就大错特错了,下面我们看一下扫码的页面:

    这里写图片描述

    看完以上页面你会冒出两个问题:

    1.要如何去自定义扫码界面?
    2.怎么把界面竖过来?
    

    好了,接下来就着手去准备解决这两个问题!

    1、自定义扫码界面

    在ZXing的github说明文档有提到过如何去自定义界面:

    这里写图片描述

    官方的建议是看例子,然后看源码。

    下面是介绍如何去自定义扫描界面的文档地址:

    DecoratedBarcodeView

    之前有提到过ZXing配置好后一行代码就可以开启二维码扫描页面,在知道如何自定义界面之前我们可以了解一下这一行代码是怎么打开扫描页面的。

    new IntentIntegrator(this).initiateScan();

    上面的代码中,this就是当前Activity的引用,而IntentIntegrator类中的initiateScan()方法其实就是调用了startActivityForResult()方法:

        public final void initiateScan() {
            startActivityForResult(createScanIntent(), requestCode);
        }

    上面方法中的createScanIntent()返回一个从当前Activity跳转到另外一个Activity的Intent

        public Intent createScanIntent() {
            Intent intentScan = new Intent(activity, getCaptureActivity());
            ...
            return intentScan;
        }

    而要跳转的Activity也就是二维码的扫描界面了,它实际上就是CaptureActivity:

        public Class<?> getCaptureActivity() {
            if (captureActivity == null) {
                captureActivity = getDefaultCaptureActivity();
            }
            return captureActivity;
        }
    
    
        protected Class<?> getDefaultCaptureActivity() {
            return CaptureActivity.class;
        }

    所以我们想自定义二维码扫描界面,就需要从CaptureActivity入手,接下来就是自定义界面的重点了!

    CaptureActivity的代码非常少,连一百行都不到,之前看过的许多博客都是写一个类继承CaptureActivity,但其实这样也不够方便,我的做法是直接创建一个Activity,将CaptureActivity中的代码复制过来,然后稍作改动即可,接下来我创建一个活动ScanQRCodeActivity:

    public class ScanQRCodeActivity extends AppCompatActivity {
    
    
        private CaptureManager capture;
        private DecoratedBarcodeView bv_barcode;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_scan_qrcode);
    
            bv_barcode = (DecoratedBarcodeView) findViewById(R.id.bv_barcode);
    
            capture = new CaptureManager(this, bv_barcode);
            capture.initializeFromIntent(getIntent(), savedInstanceState);
            capture.decode();
        }
    
    
        @Override
        protected void onResume() {
            super.onResume();
            capture.onResume();
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            capture.onPause();
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            capture.onDestroy();
        }
    
        @Override
        protected void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            capture.onSaveInstanceState(outState);
        }
    
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) {
            capture.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    
        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
            return bv_barcode.onKeyDown(keyCode, event) || super.onKeyDown(keyCode, event);
        }
    
    }

    上面的代码与CaptureActivity相差无几,只不过把布局界面替换了一下,下面是布局界面R.layout.activity_scan_qrcode:

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".Activity.ScanQRCodeActivity">
    
        <com.journeyapps.barcodescanner.DecoratedBarcodeView
            android:id="@+id/bv_barcode"
            app:zxing_use_texture_view="false"
            app:zxing_preview_scaling_strategy="centerCrop"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    
    </android.support.constraint.ConstraintLayout>

    在这个活动的布局界面中,我们只添加了一个DecoratedBarcodeView,它就是扫描界面的核心,之后如果想自定义布局,从这个活动的layout入手即可。

    然后,我们就可以用我们自己创建的这个活动去代替CaptureActivity了,开心的是启动二维码扫描界面依旧是一行,不过现在它变成这样了:

    new IntentIntegrator(this).setCaptureActivity(ScanQRCodeActivity.class).initiateScan();

    上面的方法中多了一个setCaptureActivity()方法,这个方法看源码非常简单了,调用这个方法可以把默认的CaptureActivity替换为我们自定义的ScanQRCodeActivity。

    接下来你只需要重写当前活动的onActivityResult()方法,即可正常使用扫码工具了,具体用法就是:

        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data){
            IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
            if(result != null) {
                if(result.getContents() == null) {
                    Log.d(getClass().getName(), "Cancelled");
                    Toast.makeText(this, "扫描结果为空", Toast.LENGTH_LONG).show();
                } else {
                    Log.d(getClass().getName(), "Scanned: " + result.getContents());
                    Toast.makeText(this, result.getContents(), Toast.LENGTH_LONG).show();
                }
            }
        }

    这样,自定义问题就解决了,接下来就是如何做到竖屏扫描

    2、竖屏显示扫码界面

    这个问题的解决方案其实在github的说明文档中也有,不过存在一点小问题,下面是完善做法:

    由于之前我们自定义了一个活动ScanQRCodeActivity,将其在AndroidManifest中配置改为:

     <activity android:name=".Activity.ScanQRCodeActivity"
                android:screenOrientation="fullSensor"
                xmlns:tools="http://schemas.android.com/tools"
                tools:replace="screenOrientation"/>

    接下来看一下效果即可:

    这里写图片描述

    大功告成!

    接下来,就可以使用Zxing扫码了!

    But。。。

    实际使用的时候需求不会是这么简单的,下面有两个主要的需要,看一下如何不更改源码去实现它们:

    需求一:扫码结束后依旧停留在当前页面

    从上面的情况来看,扫码返回的结果是在上一个Activity中获得的,所以每次扫码结束后就会退出扫码界面,那么,如何解决这个问题呢?

    其实很简单

    我们已经知道了,实现扫码的View是DecoratedBarcodeView,在这个视图的方法中,有一个回调方法——BarcodeCallback

    重点来啦,BarcodeCallback回调方法其实就是获取扫描结果的核心,只需要给DecoratedBarcodeView设置该回调就可以在当前Activity获取扫描结果:

        private BarcodeCallback barcodeCallback = new BarcodeCallback() {
            @Override
            public void barcodeResult(BarcodeResult result) {
                if (result != null){
                    Log.e(getClass().getName(), "获取到的扫描结果是:" + result.getText());
                }
            }
    
            @Override
            public void possibleResultPoints(List<ResultPoint> resultPoints) {
    
            }
        };

    设置回调:

    bv_barcode.decodeSingle(barcodeCallback);

    上面的decodeSingle()方法表示只扫描一次,也就是获取到结果后就不再进行扫描。

    到这里,第二个需求就来了

    需求二:在当前页面进行多次扫描

    DecoratedBarcodeView的设置回调方法里共有两种方法去设置回调,分别是:

    • bv_barcode.decodeSingle(barcodeCallback);

    • bv_barcode.decodeContinuous(barcodeCallback);

    其实想要连续扫描,使用第二个方法即可,不过万万没想到,如果你使用了decodeContinuous()去设置回调的话,那你扫描成功的一瞬间,你会获得重复N次的扫描结果,显然,这种体验是蛋疼的,接下来又是亮点,要怎么去处理这个问题呢?

    解决问题的方法依旧很简单,你只需要注意到我之前在Activity生命周期中有写到的这两个方法:

    bv_barcode.resume();
    
    bv_barcode.pause();
    

    看到这里,想必你已经知道接下来该怎么做了

    没错,在获取扫码结果回调的方法中调用:

    bv_barcode.pause();

    然后再你处理结果后再调用:

    bv_barcode.resume();

    比如我这样写:

        private BarcodeCallback barcodeCallback = new BarcodeCallback() {
            @Override
            public void barcodeResult(BarcodeResult result) {
                bv_barcode.pause();
                if (result != null){
                    Log.e(getClass().getName(), "获取到的扫描结果是:" + result.getText());
    
                    //可以对result进行一些判断,比如说扫描结果不符合就再进行一次扫描
                    if (result.getText().contains("符合我的结果")){
                       //符合的可以不在扫描了,当然你想继续扫描也是可以的
                    } else {
                        bv_barcode.resume();
                    }
                }
            }
    
            @Override
            public void possibleResultPoints(List<ResultPoint> resultPoints) {
    
            }
        };

    接下来看一看最终简易版的实现代码吧:

    public class MainActivity extends AppCompatActivity{
    
        private DecoratedBarcodeView bv_barcode;
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            bv_barcode = findViewById(R.id.bv_barcode);
            bv_barcode.decodeContinuous(barcodeCallback);
        }
    
    
        @Override
        protected void onResume() {
            super.onResume();
            bv_barcode.resume();
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            bv_barcode.pause();
        }
    
        private BarcodeCallback barcodeCallback = new BarcodeCallback() {
            @Override
            public void barcodeResult(BarcodeResult result) {
                bv_barcode.pause();
                if (result != null){
                    Log.e(getClass().getName(), "获取到的扫描结果是:" + result.getText());
    
                    //可以对result进行一些判断,比如说扫描结果不符合就再进行一次扫描
                    if (result.getText().contains("符合我的结果")){
                       //符合的可以不在扫描了,当然你想继续扫描也是可以的
                    } else {
                        bv_barcode.resume();
                    }
                }
            }
    
            @Override
            public void possibleResultPoints(List<ResultPoint> resultPoints) {
    
            }
        };
    }

    好的,不修改源码实现自定义Zxing二维码扫描的学习就到此结束了,有什么问题请留言交流。

    image

    展开全文
  • 一 、引入Zxing依赖 ... <artifactId>core <version>3.2.1 ... BitMatrix bitMatrix = new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE, width, ...运行main方法 在项目路劲下会生成指定文件名的二维码

    一 、引入Zxing依赖

    <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>core</artifactId>
            <version>3.2.1</version>
        </dependency>

    代码演示

    public class weima {
    
        private static final int BLACK = 0xFF000000;
        private static final int WHITE = 0xFFFFFFFF;
    
        private weima() {
        }
    
        public static BufferedImage toBufferedImage(BitMatrix matrix) {
            int width = matrix.getWidth();
            int height = matrix.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, matrix.get(x, y) ? BLACK : WHITE);
                }
            }
            return image;
        }
    
        public static void writeToFile(BitMatrix matrix, String format, File file)
                throws IOException {
            BufferedImage image = toBufferedImage(matrix);
            if (!ImageIO.write(image, format, file)) {
                throw new IOException("Could not write an image of format "
                        + format + " to " + file);
            }
        }
    
        public static void main(String[] args) throws Exception {
            String text = "内容";
            int width = 300;
            int height = 300;
            String format = "png";
            Hashtable hints = new Hashtable();
            hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
            BitMatrix bitMatrix = new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE, width, height, hints);
            File outputFile = new File("new.png");
            weima.writeToFile(bitMatrix, format, outputFile);
        }
    }
    

    运行main方法 在项目路劲下会生成指定文件名的二维码

    展开全文
  • Android 项目中生成二维码的开源项目主要有,SwetakeQRCode、BarCode4j、Zxing等等。         本章节讲述Zxing框架的使用     代码说明   核心代码1:处理扫描结果 /** * 处理扫描结果 * @...
  • 这是一个基于ZBarSDK的二维码扫描,完全自定义界面,简单实用,漂亮
  • --二维码--&gt; &lt;dependency&gt; &lt;groupId&gt;com.google.zxing&lt;/groupId&gt; &lt;artifactId&gt;core&lt;/artifactId&gt; &lt;version&gt;3.1.0&...
  • 1、导入jar包、这里使用core包 下载网址... 2、创建二维码 使用到了矩阵 try { //判断URL合法性 if (url == null || "".equals(url) || url.length() < 1

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 52,622
精华内容 21,048
关键字:

二维码框架