gpt4 book ai didi

android - 使用 zxing 的 DataMatrix 编码仅生成 14px 位图

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:30:37 26 4
gpt4 key购买 nike

我正在使用 zxing 生成不同类型的条形码(EAN、2of5 和 DataMatrix)。生成一般工作正常。我目前遇到的唯一问题是 zxing 只生成一个 14x14 像素位图,这太小了。但仅在使用 DataMatrix 时! EAN13、2of5/ITF 和 QR 码与相同的代码完美配合。

我的代码:

BitMatrix bitMatrix = new DataMatrixWriter().encode(message, BarcodeFormat.DATA_MATRIX, 1080, 1080, null);
int height = bitMatrix.getHeight(); //height is always 14, it doesn't matter what value I pass to the encoder

正如您想象的那样,这在像 nexus 5 这样的 1080p 屏幕上看起来很糟糕。我是不是弄错了什么?我是否必须为 DataMatrix 做一些特殊设置?

Google 和 Stackoverflow 帮不了我,因为我找不到任何使用 DataMatrix 的例子

App screenshot of DataMatrix barcode

更新这就是我将位矩阵转换为位图的方式

    int width = bitMatrix.getWidth();
int height = bitMatrix.getHeight();
int[] pixels = new int[width * height];
// All are 0, or black, by default
for (int y = 0; y < height; y++) {
int offset = y * width;
for (int x = 0; x < width; x++) {
pixels[offset + x] = bitMatrix.get(x, y) ? BLACK : WHITE;
}
}
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
bitmap.setPixels(pixels, 0, width, 0, 0, width, height);

如果我对高度使用任何其他值,我会得到一个 OutOfBoundsException,这是非常明显的(我没想到其他任何事情)...

当我尝试缩放 imageview 并设置固定的宽度和高度时,条形码是可扫描的,但看起来很糟糕。这也很明显,因为位矩阵只有 14x14 而不是我指定的大小。

enter image description here

有没有一种简单的方法可以以某种方式缩放位矩阵?因为它只由点组成,所以应该可以,但我不想自己计算。除了 stackoverflow 之外,我找不到任何关于位矩阵的文档,这对我没有任何帮助。

如果我通过 HintMap 将 MinWidth 或 MaxWidth 传递给编码器,应用程序总是会因异常而崩溃。HintMap(mWidth 是设备的显示宽度,但我尝试了几个值): 哈希表提示图 = 新哈希表();

hintMap.put(EncodeHintType.MIN_SIZE, new Dimension(mWidth, mWidth));
hintMap.put(EncodeHintType.MAX_SIZE, new Dimension(mWidth, mWidth));
hintMap.put(EncodeHintType.DATA_MATRIX_SHAPE, SymbolShapeHint.FORCE_SQUARE);

异常(exception):

java.lang.IllegalArgumentException: Can't find a symbol arrangement that matches the message. Data codewords: 7

在我看来,最后一个问题像是 zxing 中的一个错误。我不明白为什么如果我改变大小生成不起作用。

最佳答案

这是一个小示例,您可以如何更改从 BitMatrix 到 Bitmap 的转换方法。该方法对 BitMatrix 进行缩放。

int BLACK = 0xFF000000;
int WHITE = 0xFFFFFFFF;

// change the values to your needs
int requestedWidth = 300;
int requestedHeight = 300;

int width = bitMatrix.getWidth();
int height = bitMatrix.getHeight();

// calculating the scaling factor
int pixelsize = requestedWidth/width;
if (pixelsize > requestedHeight/height)
{
pixelsize = requestedHeight/height;
}

int[] pixels = new int[requestedWidth * requestedHeight];
// All are 0, or black, by default
for (int y = 0; y < height; y++) {
int offset = y * requestedWidth * pixelsize;

// scaling pixel height
for (int pixelsizeHeight = 0; pixelsizeHeight < pixelsize; pixelsizeHeight++, offset+=requestedWidth) {
for (int x = 0; x < width; x++) {
int color = bitMatrix.get(x, y) ? BLACK : WHITE;

// scaling pixel width
for (int pixelsizeWidth = 0; pixelsizeWidth < pixelsize; pixelsizeWidth++) {
pixels[offset + x * pixelsize + pixelsizeWidth] = color;
}
}
}
}
Bitmap bitmap = Bitmap.createBitmap(requestedWidth, requestedHeight, Bitmap.Config.ARGB_8888);
bitmap.setPixels(pixels, 0, requestedWidth, 0, 0, requestedWidth, requestedHeight);

// I could only test it with BufferedImage and a modified version of the zxing J2SE client
// BufferedImage bitmap = new BufferedImage(requestedWidth, requestedHeight, BufferedImage.TYPE_INT_ARGB);
// bitmap.getRaster().setDataElements(0, 0, requestedWidth, requestedHeight, pixels);

关于android - 使用 zxing 的 DataMatrix 编码仅生成 14px 位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22766017/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com