Android QR位图需要帮助才能删除保证金

时间:2017-05-03 19:55:17

标签: java android bitmap pixel

我已将一个String编码为QR位图。图片变成这样:

image of QR bitmap

我需要更改什么,以便QR周围没有空格?我试着阅读有关MultiFormatWriter()和setPixels()的文档,但无法找出它出错的地方。 这是代码:

Bitmap encodeAsBitmap(String str) throws  WriterException {
    BitMatrix result;
    try {
        result = new MultiFormatWriter().encode(str,
                BarcodeFormat.QR_CODE, 500, 500, null);
    } catch (IllegalArgumentException iae) {
        return null;
    }

    int w = result.getWidth();
    int h = result.getHeight();
    int[] pixels = new int [w * h];
    for (int i = 0; i < h; i++) {
        int offset = i * w;
        for (int j = 0; j < w; j++) {
            pixels[offset + j] = result.get(i, j) ? BLACK : WHITE;
        }
     }

    Bitmap bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
    bitmap.setPixels(pixels, 0, 500, 0, 0, w, h);
    return bitmap;

}

2 个答案:

答案 0 :(得分:1)

您应该使用提示参数来设置自定义边距。

Map<EncodeHintType, Object> hints = new EnumMap<>(EncodeHintType.class);
hints.put(EncodeHintType.MARGIN, marginSize);
BitMatrix result = new MultiFormatWriter().encode(contentsToEncode, BarcodeFormat.QR_CODE, imageWidth, imageHeight, hints);

答案 1 :(得分:0)

我认为问题在于你在Bitmap中设置像素的方式。

根据documentation

  

stride int:要在行之间跳过的像素数量[]。通常,此值将与位图的宽度相同,但可以更大(或为负)。

所以我建议如下:

bitmap.setPixels(pixels, 0, w, 0, 0, w, h);

修改 刚刚注意到你假设输入的大小是500.你可以尝试计算它(假设你的字符串代表一个正方形)。如果它是一个矩形,你必须能够以某种方式计算大小,以便MultiFormatWriter可以读取它。

所以你的代码可以是:

Bitmap encodeAsBitmap(String str, int size) throws  WriterException {

    BitMatrix result;
    try {
        result = new MultiFormatWriter().encode(str,
                BarcodeFormat.QR_CODE, size, size, null);
    } catch (IllegalArgumentException iae) {
        return null;
    }

    int[] pixels = new int [size * size];
    for (int i = 0; i < size; i++) {
        int offset = i * size;
        for (int j = 0; j < size; j++) {
            pixels[offset + j] = result.get(i, j) ? BLACK : WHITE;
        }
     }

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

}