`
iaiai
  • 浏览: 2196324 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android:使用ZXing生成二维码(支持添加Logo图案)

 
阅读更多
ZXing是谷歌的一个开源库,可以用来生成二维码、扫描二维码。

ZXing相关各种文件官方下载地址:https://github.com/zxing/zxing/releases

生成二维码的工具类
/**
 * 二维码生成工具类
 */
public class QRCodeUtil {
    /**
     * 生成二维码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 = 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;
    }
 
}


在Activity中的使用:
/**
 * 二维码生成
 */
public class MainActivity extends ActionBarActivity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        //内容
        final EditText contentET = (EditText) findViewById(R.id.create_qr_content);
        //显示二维码图片
        final ImageView imageView = (ImageView) findViewById(R.id.create_qr_iv);
        //是否添加Logo
        final CheckBox addLogoCB = (CheckBox) findViewById(R.id.create_qr_addLogo);
        Button createQrBtn = (Button) findViewById(R.id.create_qr_btn);
 
        createQrBtn.setOnClickListener(new View.OnClickListener() {
 
            @Override
            public void onClick(View v) {
                final String filePath = getFileRoot(MainActivity.this) + File.separator
                        + "qr_" + System.currentTimeMillis() + ".jpg";
 
                //二维码图片较大时,生成图片、保存文件的时间可能较长,因此放在新线程中
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        boolean success = QRCodeUtil.createQRImage(contentET.getText().toString().trim(), 800, 800,
                                addLogoCB.isChecked() ? BitmapFactory.decodeResource(getResources(), R.mipmap.qr_logo) : null,
                                filePath);
 
                        if (success) {
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    imageView.setImageBitmap(BitmapFactory.decodeFile(filePath));
                                }
                            });
                        }
                    }
                }).start();
 
            }
        });
    }
 
    //文件存储根目录
    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();
    }
}
分享到:
评论

相关推荐

    Android:使用ZXing生成二维码(支持添加Logo图案)-附件资源

    Android:使用ZXing生成二维码(支持添加Logo图案)-附件资源

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

    2. **添加logo**: 在生成二维码后,我们需要在二维码中心位置插入logo。首先,对logo进行适当的缩放,保持其与二维码尺寸的比例,防止过大影响二维码识别。可以使用Java的`BufferedImage`类进行图片处理,包括缩放、...

    安卓Android源码——zxing 生成二维码名片.rar

    2. **生成二维码图像**:使用ZXing库中的`MultiFormatWriter`类,可以将上述数据字符串转换为一个BitMatrix对象,这是二维码图像的基础。BitMatrix是一个二维的布尔数组,其中的每个元素表示二维码的一个像素。 3. ...

    ZXing生成可选logo和文字的二维码图片工具类ZXingCodeUtils

    - 生成二维码的图像格式(如PNG、JPEG等)可以根据需求选择,ZXing库提供了多种图像输出格式的支持。 总之,ZXingCodeUtils是一个实用的工具,结合了ZXing的强大功能,使得生成个性化二维码变得更加简单。通过合理...

    Android 二维码生成和扫描 生成二维码可带 LOGO

    在Android平台上,开发一款能够生成二维码并带有LOGO的应用是一项常见的需求。二维码作为一种高效的信息载体,广泛应用于名片、网址链接、商品信息等场景。本文将深入探讨如何在Android应用中实现二维码的生成与扫描...

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

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

    Android代码-java使用qrCode生成二维码实例中间带logo.zip

    在Android平台上,生成二维码是一项常见的任务,特别是在移动应用开发中,二维码可以用于快速分享信息、登录验证等场景。本实例将介绍如何在Java代码中生成带有Logo的二维码。以下是详细的知识点讲解: 1. **二维码...

    Android应用源码之zxing 生成二维码名片.zip

    本项目聚焦于使用ZXing(Zebra Crossing)库在Android应用中生成二维码名片。ZXing是一个开源的条形码读取库,支持多种条码格式,包括一维条码和二维条码如QR码。 首先,我们需要理解ZXing库的核心概念。ZXing提供...

    Android高级应用源码-java使用qrCode生成二维码实例中间带logo.rar

    这个"Android高级应用源码-java使用qrCode生成二维码实例中间带logo.rar"压缩包提供了一个示例,教你如何在生成的二维码中间嵌入logo,使二维码更加个性化且易于识别。下面我们将深入探讨这个知识点。 首先,我们...

    ZXing二维码识别和生成的demo

    ZXing本身并不直接支持添加logo,但开发者可以通过第三方图像处理库(如Java的`BufferedImage`或Android的`Bitmap`)进行二次处理,确保logo不会影响二维码的可读性。 4. **集成ZXing到项目**: - 对于Android项目...

    Android 中生成普通二维码、中心Logo 二维码、以及扫描解析二维码

    要在二维码中间添加Logo,可以在生成二维码后,将Logo图片绘制到二维码上。首先,加载Logo图片为Bitmap,然后计算Logo的大小和位置,确保其位于二维码中心,最后将Logo绘制到二维码上: ```java private Bitmap ...

    zxing Android 二维码扫描

    5. **生成二维码**:使用`com.google.zxing.common.BitMatrix`和`com.google.zxing.qrcode.QRCodeWriter`类,将文本信息编码为二维码图像。 6. **自定义界面**:ZXing提供了一些资源文件和布局,可以根据需要修改以...

    使用Zxing实现二维码生成器内嵌图片

    7. **代码示例**: 示例代码中展示了如何使用ZXing生成二维码,并内嵌图片。`genBarcode`方法负责生成带有图片的二维码,它接受内容、宽度、高度和图片路径作为参数。生成的二维码可以保存为文件,也可以通过输出流...

    android 带Logo二维码生成源码

    4. 二维码生成:使用ZXing库的CoreLibrary.jar进行二维码编码,将处理后的数据转化为二维码图像。ZXing提供了多种编码格式,包括QRCode,可以根据需要选择。 5. 保存至图库:生成的带Logo二维码需要保存到用户的...

    Android Zxing生成二维码经典案例分享

    本篇文章将详细解析如何利用Zxing在Android环境中生成二维码,并提供带logo的二维码生成方法。 首先,为了使用Zxing库,我们需要在项目的build.gradle文件中添加依赖。在dependencies块中,引入如下代码: ```...

    android生成二维码-带logo

    要生成带有logo的二维码,我们需要先生成二维码图像,然后将logo图片插入到二维码的中心位置。这里假设logo图片已经转换为Bitmap对象: ```java public Bitmap createQRCodeWithLogo(String content, int width, ...

    安卓条码扫描二维码相关-java使用qrCode生成二维码实例中间带logo.zip

    这个压缩包"安卓条码扫描二维码相关-java使用qrCode生成二维码实例中间带logo.zip"提供了使用Java语言生成带有logo的二维码的实例代码。以下是关于这个主题的详细知识点: 1. **二维码基本原理**: 二维码(Quick ...

Global site tag (gtag.js) - Google Analytics