`

使用zxing实现生成二维码

 
阅读更多
github:
https://github.com/billcarbit/QRCodeDemo

package qrcode.com.qrcodedemo;

/**
 * Created by Administrator on 2016-11-27.
 */

import android.graphics.Bitmap;
import android.graphics.Canvas;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * 二维码生成工具类
 */
public class QRCodeUtils {
    /**
     * 生成二维码Bitmap
     *
     * @param content   内容
     * @param widthPix  图片宽度
     * @param heightPix 图片高度
     * @param logoBm    二维码中心的Logo图标(可以为null)
     * @param filePath  用于存储二维码图片的文件路径
     * @return 生成二维码及保存文件是否成功
     */
    public static boolean createQRImage(String content, int widthPix, int heightPix, Bitmap logoBm, String filePath) {
        try {
            if (content == null || "".equals(content)) {
                return false;
            }

            //配置参数
            Map<EncodeHintType, Object> hints = new HashMap<>();
            hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
            //容错级别
            hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
            //设置空白边距的宽度
            //            hints.put(EncodeHintType.MARGIN, 2); //default is 4

            // 图像数据转换,使用了矩阵转换
            BitMatrix bitMatrix = null;
            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 != null && bitmap.compress(Bitmap.CompressFormat.JPEG, 100, new FileOutputStream(filePath));
        } catch (WriterException | IOException e) {
            e.printStackTrace();
        }

        return false;
    }

    /**
     * 在二维码中间添加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;
    }

}





package qrcode.com.qrcodedemo;

import android.content.Context;
import android.graphics.BitmapFactory;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ImageView;


import java.io.File;

import rx.Observable;
import rx.Observer;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final ImageView imageView = (ImageView) findViewById(R.id.iv_qrcode);
        final String filePath = getFileRoot(MainActivity.this) + File.separator
                + "qr_" + System.currentTimeMillis() + ".jpg";
        //二维码图片较大时,生成图片、保存文件的时间可能较长,因此放在新线程中
        Observable.create(new Observable.OnSubscribe<Boolean>() {
            @Override
            public void call(Subscriber<? super Boolean> subscriber) {
                Boolean success = QRCodeUtils.createQRImage("www.baidu.com".toString().trim(), 800, 800,
                        BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher),
                        filePath);
                subscriber.onNext(success);
                subscriber.onCompleted();
            }
        }).subscribeOn(Schedulers.io()) // 指定 subscribe() 发生在 IO 线程
                .observeOn(AndroidSchedulers.mainThread()) // 指定 Subscriber 的回调发生在主线程
                .subscribe(new Observer<Boolean>() {
                    @Override
                    public void onNext(Boolean success) {
                        if (success) {
                            imageView.setImageBitmap(BitmapFactory.decodeFile(filePath));
                        }
                    }

                    @Override
                    public void onCompleted() {
                    }

                    @Override
                    public void onError(Throwable e) {

                    }
                });

    }

    //文件存储根目录
    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();
    }
}


分享到:
评论

相关推荐

    Zxing生成二维码(解决中文乱码)

    这是Zxing的源码,没有打包成jar利于学习使用。...使用时注意path的默认地址,Main类中是生成二维码的代码,GetMain类中是读取二维码的代码。 eclipse中Ctrl+Shift+R快速查找类 希望对你有所帮助。

    java扩展zxing自定义生成二维码源码(美化、艺术)

    看着网上好看的二维码,也想着自己实现一个,经过3周的理论加开发时间,终于实现,详细介绍请看 https://blog.csdn.net/u011837804/article/details/129229973,本源码基于zxing组件扩展实现了草料二维码99%的功能。...

    Android利用zxing生成二维码,识别二维码超详细、超简易demo

    Android利用zxing生成二维码,识别二维码超详细、超简易demo,解压后用Android studio可直接打开,附教程:https://blog.csdn.net/mountain_hua/article/details/80646089

    Android使用ZXing实现二维码扫描和生成二维码

    Android使用ZXing实现二维码扫描和生成二维码 可打开默认二维码扫描页面 支持对图片Bitmap的扫描功能 支持对UI的定制化操作 支持对条形码的扫描功能 支持生成二维码操作 支持控制闪光灯开关

    使用zxing开发的二维码/条形码/带logo彩色二维码例子

    在本项目中,我们关注的是ZXing在生成二维码和条形码方面的应用。首先,我们可以使用ZXing库的API生成标准的黑白二维码和条形码,这些API通常包括设置数据内容、指定编码格式、调整尺寸等功能。生成过程涉及将输入的...

    zxing生成二维码,图片Base64编码

    在Java环境下,使用ZXing生成二维码的步骤如下: 1. 引入ZXing库:在项目中添加ZXing的依赖,通常通过Maven或Gradle来管理。对于Maven,可以在pom.xml文件中添加如下依赖: ```xml &lt;groupId&gt;com.google.zxing&lt;/...

    ZXing java生成二维码

    ZXing java 生成 二维码,ZXing-core-2.3.0.jar

    利用ZXING生成简易二维码

    在标题“利用ZXING生成简易二维码”中,提到的核心知识点是使用ZXing库来创建二维码。ZXing库提供了Java、Android以及命令行工具等多种方式来操作二维码。生成二维码的基本步骤包括: 1. **配置ZXing**: 首先,你...

    使用Java zxing开发的二维码 带logo彩色二维码

    1. **二维码编码**: 首先,我们需要了解如何使用ZXing生成普通的黑白二维码。ZXing的`com.google.zxing.client.j2se.MatrixToImageWriter`类可以将数据编码为矩阵,并转换为位图图像。通过调用`MatrixToImageConfig`...

    ZXing生成二维码包

    生成二维码是ZXing库的核心功能之一。二维码可以存储大量的文本信息,如网址、联系信息、文本字符串等。在Java环境中,我们可以使用ZXing的`com.google.zxing.client.j2se.QRCodeWriter`类来创建一个二维码写入器。...

    C#使用zXing插件生成二维码

    ### C# 使用 zXing 插件生成二维码详解 #### 一、概述 在现代软件开发过程中,二维码的使用越来越广泛。它不仅被用于产品跟踪、文档管理等场景,也被广泛应用在移动支付、营销推广等领域。为了更好地实现二维码的...

    谷歌的zxing方式生成二维码的jar包和已经写好的工具类

    这个助手类是为了简化使用ZXing生成二维码的过程,通常会封装一些常用方法,如设置二维码的内容、大小、纠错级别等。在实际使用时,只需要在项目中复制这个助手类,然后通过调用其提供的方法,就可以快速地生成...

    C#使用ZXing.Net生成二维码和条形码,包含识别条码内容

    C#使用ZXing.Net生成二维码和条形码,可以输入的内容生成条码,可以设置条码的宽度和高度,以及各种条码类型,还可以通过拖拽直接识别条码内容 具体操作见:...

    C# 利用 ZXing.Net 实现二维码生成与识别(WPF 做的一个 Demo)

    一个在 .NET Framework 环境下实现的二维码生成与识别的小程序。 本人综合比较了已有的第三方库,最终选择了 ZXing.Net 。ZXing.Net 是开源项目 https://github.com/zxing/zxing 在 .NET 平台上的实现;虽然 NuGet ...

    C# ZXing.Net 生成二维码支持中文Demo

    要使用ZXing.Net在C#中生成包含中文的二维码,首先需要在项目中引入ZXing.Net库。这可以通过NuGet包管理器完成,搜索并安装“ZXing.Net”即可。接下来,我们来看一个简单的代码示例: ```csharp using System....

    使用zxing加密解析二维码

    对于Android开发者,可以直接引入ZXing的Android端库,利用`IntentIntegrator`和`IntentResult`进行集成,实现扫描和生成二维码的功能。 为了更好地理解和实践这些概念,你可以查看压缩包中的`zxing-qrcode`文件,...

    spring boot用zxing生成二维码,支持logo.qrcode-master.zip

    在本文中,我们将深入探讨如何在...通过引入ZXing依赖,创建服务类和控制器,我们可以实现一个动态生成二维码的服务,同时允许用户自定义logo。这样的服务在各种应用场景中都非常实用,比如推广链接、电子票务等。

    Zxing扫描生成二维码

    生成二维码的过程则涉及`com.google.zxing.qrcode:`模块。这个模块提供了`QRCodeWriter`类,用于将字符串、URL或其他数据转换成二维码图像。用户可以设定二维码的版本、纠错级别、边距等参数,以适应不同的需求。`...

    使用google-zxing 生成二维码的简单小实例

    本实例将详细介绍如何使用ZXing来生成二维码。 首先,ZXing库的引入至关重要。在Java项目中,你可以通过Maven或Gradle将ZXing的相关依赖引入到构建文件中。对于Maven,可以在`pom.xml`文件中添加以下依赖: ```xml...

    zxing3.3.1二维码生成

    以下是使用ZXing生成二维码的基本步骤: 1. 引入ZXing库:将`zxing3.3.1.jar`添加到项目的类路径中,如果是Java项目,可以将其放入`lib`目录下,或者在Maven/Gradle构建工具中配置依赖。 2. 创建BitMatrix对象:这...

Global site tag (gtag.js) - Google Analytics