Zxing:生成的条形码不使用全宽

时间:2014-07-21 13:27:05

标签: android barcode zxing

我正在尝试使用Zxing生成Code128条形码:

try {
    int width = (int) (barcode.getWidth() * 0.95f);
    int height = (int) (width * 0.2f);
    BitMatrix bitMatrix = writer.encode(code.number, BarcodeFormat.CODE_128, width, height);
    Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    for (int i = 0; i < width; i++) {
        for (int j = 0; j < height; j++) {
            bitmap.setPixel(i, j, bitMatrix.get(i, j) ? Color.BLACK : Color.WHITE);
        }
    }
    barcode.setImageBitmap(bitmap);
} catch (WriterException e) {
    e.printStackTrace();
}

其中barcodeImageView,其宽度设置为match_parent(边距为5dp),高度为wrap_content。我生成的图像的宽高比为5:1,我预计黑色条纹会出现在图像的最开头,并在最后完成。

但是会发生这种情况:

barcode

ImageView具有绿色背景(请注意图像宽度为ImageView宽度的95%),白色部分属于图像。正如你所看到的,有一个巨大的白色区域,可能是图像的40%。

问题是为什么条纹没有填满我在writer.encode()方法中指定的全部(或大部分)宽度?我怎么能强迫这种情况发生呢?

更新

对比例类型使用不同的值时,我注意到白色边缘仅出现在条形码的两侧,而不会高于或低于条形码。

3 个答案:

答案 0 :(得分:4)

条形码中的条形必须具有整数个像素的宽度,否则会出现一些扭曲。条形码尽可能宽,以满足这些限制。

此用例的一个很好的解决方案是将宽度设置为1.这将强制图像尽可能小;窄条将是一个像素。然后,您可以让Android完全按照您的喜好进行缩放。

答案 1 :(得分:0)

这不是最通用的答案,但这就是我解决它的方法:

我的代码使用Code128标准,其中每个符号是11个条纹的组合(黑色或白色。代码也有固定长度,20个字符。所以我强迫writer使用宽度20 * 11像素。这确实有效,代码周围的安静区域很小。

然而,为了缩放目的,宽度不够好。根据屏幕的不同,图像不会以良好的方式缩放,以非均匀的方式扭曲条纹,使代码不可读。然后我选择使用此20 * 11 * 4像素对图像进行过采样。结果要好得多,因为现在图像按比例缩小,而不是像以前一样。

过采样因子可能会根据您需要显示的尺寸而有所不同,但如果您处于类似情况,条形码和每个符号的长度固定,这是一种简单的方法,可以获得一个安静的条码区域,不涉及任何进一步的图像处理。

答案 2 :(得分:0)

我通过添加

解决了这个问题
android:layout_marginRight="-30dp"
android:layout_marginLeft="-30dp"

到带条形码的ImageView。