4

我使用zxing库来生成二维码。当我生成 QR 时它工作正常,但它在 QR 的左右两侧有一个空白区域。如何删除此空白(使位图宽度=高度)

这是我生成 QR 的代码

    private static final int QR_SIZE = 480;

  public static Bitmap generateQR(String content){
      Bitmap returnBitmap= null;
      try {
        Hashtable<EncodeHintType, ErrorCorrectionLevel> hintMap = new Hashtable<EncodeHintType, ErrorCorrectionLevel>();
        hintMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);
        QRCodeWriter qrCodeWriter = new QRCodeWriter();
        BitMatrix matrix = qrCodeWriter.encode(content, BarcodeFormat.QR_CODE, QR_SIZE, QR_SIZE, hintMap);
        //int width = matrix.getWidth();
        int width = matrix.getHeight();
        int height = matrix.getHeight();
        int[] pixels = new int[width*height];
        for(int y=0; y<height; y++) {
            for(int x=0; x<width; x++) {
                int grey = matrix.get(x, y) ? 0x00 : 0xff;
                pixels[y*width+x] = 0xff000000 | (0x00010101*grey);
            }
        }    
        returnBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        returnBitmap.setPixels(pixels, 0, width, 0, 0, width, height);
        //returnBitmap.set
    } catch (Exception e) {
        Log.d(LOGTAG, e.toString());
    }
    return returnBitmap;
  }
4

6 回答 6

7

答案为时已晚,但可以在将来使用。

可以使用以下代码示例删除空格

Map<EncodeHintType, Object> hintMap = new HashMap<EncodeHintType, Object>();
hintMap.put(EncodeHintType.MARGIN, new Integer(1));
BitMatrix matrix = new MultiFormatWriter().encode(
        new String(qrCodeData.getBytes(charset), charset),
        BarcodeFormat.QR_CODE, qrCodewidth, qrCodeheight, hintMap);
于 2018-04-28T05:00:34.047 回答
4

不要删除空格,这是规范要求的。

于 2012-12-24T11:52:09.450 回答
3

为了完整起见,这是一个用 Kotlin 编写的解决方案(它基于上述答案):

fun generateQrImage(width: Int): Bitmap? {
    val code = "some code here" // Whatever you need to encode in the QR code
    val multiFormatWriter = MultiFormatWriter();
    try {
        val hintMap = mapOf(EncodeHintType.MARGIN to 0)
        val bitMatrix = multiFormatWriter.encode(code, BarcodeFormat.QR_CODE, width, width, hintMap)
        val barcodeEncoder = BarcodeEncoder();
        return barcodeEncoder.createBitmap(bitMatrix);
    } catch (e: Exception) {
        Log.error("Could not generate QR image", e)
        return null
    }
}
于 2020-05-08T09:09:00.087 回答
0

我可能为时已晚,尽管我的建议可能会帮助将来谁会遇到这个问题。

是的,你不删除空白,有些读者会用一点边框扫描它,这会更难。有些根本不会阅读。

在我的情况下,我想在 Ui 中显示 QR 码,所以我只是将我的布局设置为白色背景。以及它的阅读二维码。

于 2016-11-23T06:01:36.917 回答
0

任何有兴趣的人都可以使用下面的代码。应用此代码后,我尝试扫描二维码,它被扫描没有任何问题。

 try {

        /**
         * Allow the zxing engine use the default argument for the margin variable
         */
        int MARGIN_AUTOMATIC = -1;

        /**
         * Set no margin to be added to the QR code by the zxing engine
         */
        int MARGIN_NONE = 0;
        int marginSize = MARGIN_NONE;

        Map<EncodeHintType, Object> hints = null;
        if (marginSize != MARGIN_AUTOMATIC) {
            hints = new EnumMap<>(EncodeHintType.class);
            // We want to generate with a custom margin size
            hints.put(EncodeHintType.MARGIN, marginSize);
        }

        MultiFormatWriter writer = new MultiFormatWriter();
        BitMatrix result = writer.encode(text, BarcodeFormat.QR_CODE, imageWidth, imageHeight, hints);

        final int width = result.getWidth();
        final int height = result.getHeight();
        int[] pixels = new int[width * height];
        for (int y = 0; y < height; y++) {
            int offset = y * width;
            for (int x = 0; x < width; x++) {
                pixels[offset + x] = result.get(x, y) ? barcodeColor : barcodeBackgroundColor;
            }
        }

        Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
        return bitmap;

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

来源此页面

于 2018-03-30T10:35:06.993 回答
-1

尝试这个......:)

private void generateQRCode(String data) throws IOException {
            com.google.zxing.Writer writer = new QRCodeWriter();
            String finaldata = Uri.encode(data, "UTF-8");
            try {
                BitMatrix bm = writer.encode(finaldata, BarcodeFormat.QR_CODE, 400,
                        400);
                mBitmap = Bitmap.createBitmap(400, 400, Config.ARGB_8888);
                for (int i = 0; i < 400; i++) {
                    for (int j = 0; j < 400; j++) {
                        mBitmap.setPixel(i, j, bm.get(i, j) ? Color.BLACK
                                : Color.WHITE);
                    }
                }
            } catch (WriterException e) {
                e.printStackTrace();
            }

            if (mBitmap != null) {
                                  img_qrcode.setImageBitmap(mBitmap);
                                }
}
于 2013-04-07T18:32:46.790 回答