我正在尝试使用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();
}
其中barcode
是ImageView
,其宽度设置为match_parent
(边距为5dp),高度为wrap_content
。我生成的图像的宽高比为5:1,我预计黑色条纹会出现在图像的最开头,并在最后完成。
但是会发生这种情况:
ImageView
具有绿色背景(请注意图像宽度为ImageView
宽度的95%),白色部分属于图像。正如你所看到的,有一个巨大的白色区域,可能是图像的40%。
问题是为什么条纹没有填满我在writer.encode()
方法中指定的全部(或大部分)宽度?我怎么能强迫这种情况发生呢?
更新
对比例类型使用不同的值时,我注意到白色边缘仅出现在条形码的两侧,而不会高于或低于条形码。
答案 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。