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

Gui*_*rme 6 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();
}
Run Code Online (Sandbox Code Playgroud)

其中barcodeImageView,其宽度被设定为match_parent(与5DP余量)和高度为wrap_content.我生成的图像的宽高比为5:1,我预计黑色条纹会出现在图像的最开头,并在最后完成.

但这是会发生的事情:

条码

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

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

更新:

对于比例类型使用不同的值,我注意到白色边缘仅存在于条形码的两侧,并且从不在其上方或下方.

Sea*_*wen 5

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

对于该用例,一个好的解决方案是将宽度设置为1。这将迫使图像尽可能小;窄条将是一个像素。然后,您可以让Android完全根据需要对其进行缩放。


Gui*_*rme 2

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

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

然而,出于缩放目的,该宽度还不够好。根据屏幕的不同,图像不会以良好的方式缩放,条纹会以不均匀的方式扭曲,从而使代码不可读。然后我选择使用这次20 * 11 * 4像素对图像进行过采样。结果好多了,因为现在图像正在缩小,而不是像以前那样放大。

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