用ZXING生成二维码的工具类(可以去掉白边,添加logo)

原创 2017年01月03日 17:58:35
===========================用ZXING生成二维码的工具类(可以去掉白边,添加logo)==========================


/**
 * @auther gjc
 * @since 2016/12/27.
 */
public class CreateCodeUtil {

    public static Bitmap createQRImage(String str, int width, int height, Bitmap logoBm) {

        try {
            Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
            hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
            hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
//            hints.put(EncodeHintType.MARGIN, 1);
            BitMatrix matrix = new QRCodeWriter().encode(str, BarcodeFormat.QR_CODE, width, height);
            matrix = deleteWhite(matrix);//删除白边
            width = matrix.getWidth();
            height = matrix.getHeight();
            int[] pixels = new int[width * height];
            for (int y = 0; y < height; y++) {
                for (int x = 0; x < width; x++) {
                    if (matrix.get(x, y)) {
                        pixels[y * width + x] = Color.BLACK;
                    } else {
                        pixels[y * width + x] = Color.WHITE;
                    }
                }
            }
            Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
            bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
            bitmap = addLogo(bitmap, logoBm);
            return bitmap;
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 删除白边
     * */
    private static BitMatrix deleteWhite(BitMatrix matrix) {
        int[] rec = matrix.getEnclosingRectangle();
        int resWidth = rec[2] + 1;
        int resHeight = rec[3] + 1;

        BitMatrix resMatrix = new BitMatrix(resWidth, resHeight);
        resMatrix.clear();
        for (int i = 0; i < resWidth; i++) {
            for (int j = 0; j < resHeight; j++) {
                if (matrix.get(i + rec[0], j + rec[1]))
                    resMatrix.set(i, j);
            }
        }
        return resMatrix;
    }

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

}

相关文章推荐

zxing生成二维码去白边

今天遇到了二维码生成的图片需要切掉白边的情况,查看之前的二维码生成代码,发现有这么一行 hints.put(EncodeHintType.MARGIN, 1); 感觉应该是设置边距的意思,果断改成 h...

使用Zxing玩转二维码白边的各个花样

现在在实际应用中使用的最为广泛的二维码生成工具就是Zxing库,本文以Zxing-1.60版本做的研究分析,获取最新版本的Zxing。1.生成二维码简单介绍一下Zxing二维码库的使用方式,Zxing...

zxing 生成二维码,可设置logo、二维码颜色、白边大小

zxing 生成二维码,可设置logo、二维码前景色/后景色、白边大小、二维码大小...
  • rongku
  • rongku
  • 2016年07月10日 17:03
  • 10984

com.google.zxing生成的二维码自定义白边大小

com.google.zxing提供的定义白边大小试了好多次不起作用:        hints.put(EncodeHintType.MARGIN, 0);//设置白边宽度,取值0~4, ...
  • cnq2328
  • cnq2328
  • 2016年11月24日 11:30
  • 962

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Zxin包生成二维码白边问题解决方法

Zxing 二维码 白边

解决ZXING生成二维码图片白框太大的问题

最近项目里需要生成一些二维码,使用之后发现一些问题,生成之后的图片,白色边框区域太大了,导致二维码内容区域太小。 百度了一下,有人说设置EncodeHintType.MARGIN属性即可,这个属...

提高zxing生成二维码的容错率及zxing生成二维码的边框设置

最近做了一个项目要生成二维码,跟几年前不同,最近大家都喜欢在二维码中间加logo. 加logo倒是不难,两个图片叠一起就是了,但是遇到一个新问题,logo加得太大的话,会导致二维码扫描不出来;加...
  • ackeep
  • ackeep
  • 2017年01月06日 11:28
  • 502

java去处二维码白色边框方法

public static BitMatrix deleteWhite(BitMatrix matrix){         int[] rec = matrix.getEnclosingRecta...

zxing 去白边

网上有相关的一些分析资料,百度贴吧里也有原因,因为创建的时候预先插入了白边。 这里给出不修改源代码的方案。 测试PDF_418和QR_CODE有效 其他的同理,需要研究源代码 Java代码  ...
  • sqzhao
  • sqzhao
  • 2014年12月25日 21:53
  • 2013
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用ZXING生成二维码的工具类(可以去掉白边,添加logo)
举报原因:
原因补充:

(最多只允许输入30个字)