Android使用Zxing生成QR码和条码

Cif*_*iff 12 android barcode zxing

使用zxing生成Qr代码的代码是---

它需要字符串数据,imageview这很好用

private void generateQRCode_general(String data, ImageView img)throws WriterException {
    com.google.zxing.Writer writer = new QRCodeWriter();
    String finaldata = Uri.encode(data, "utf-8");

    BitMatrix bm = writer.encode(finaldata, BarcodeFormat.QR_CODE,150, 150);
    Bitmap ImageBitmap = Bitmap.createBitmap(150, 150,Config.ARGB_8888);

    for (int i = 0; i < 150; i++) {//width
        for (int j = 0; j < 150; j++) {//height
            ImageBitmap.setPixel(i, j, bm.get(i, j) ? Color.BLACK: Color.WHITE);
        }
    }

    if (ImageBitmap != null) {
        qrcode.setImageBitmap(ImageBitmap);
    } else {
        Toast.makeText(getApplicationContext(), getResources().getString(R.string.userInputError),
                Toast.LENGTH_SHORT).show(); 
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我的问题是,如何bar code使用相同的库.我看到一些相关的文件,bar codes但我不知道如何做到这一点.因为我想bar code在应用程序内生成而不是调用任何内容web service.由于我已经在使用zxing,因此不包括itext烧烤罐

Cif*_*iff 8

就像Gaskoin告诉的那样... MultiFormatWrite它有效:)这里是代码.

      com.google.zxing. MultiFormatWriter writer =new  MultiFormatWriter();


        String finaldata = Uri.encode(data, "utf-8");

        BitMatrix bm = writer.encode(finaldata, BarcodeFormat.CODE_128,150, 150);
        Bitmap ImageBitmap = Bitmap.createBitmap(180, 40,Config.ARGB_8888);

        for (int i = 0; i < 180; i++) {//width
            for (int j = 0; j < 40; j++) {//height
                ImageBitmap.setPixel(i, j, bm.get(i, j) ? Color.BLACK: Color.WHITE);
            }
        }

        if (ImageBitmap != null) {
            qrcode.setImageBitmap(ImageBitmap);
        } else {
            Toast.makeText(getApplicationContext(), getResources().getString(R.string.userInputError),
                    Toast.LENGTH_SHORT).show(); 
        }
Run Code Online (Sandbox Code Playgroud)


Ivá*_*nez 8

我已经测试了生成条形码的已接受答案,但在大型ImageView中使用时输出模糊.要获得高质量输出,BitMatrix,Bitmap和最终ImageView 的宽度应该相同.但是使用接受的答案这样做会使条形码生成非常慢(2-3秒).这是因为

Bitmap.setPixel()
Run Code Online (Sandbox Code Playgroud)

是一个缓慢的操作,接受的答案是密集使用该操作(2嵌套for循环).

为了克服这个问题,我修改了一点位图生成算法(仅用于生成条形码)以使用Bitmap.setPixels(),这要快得多:

private Bitmap createBarcodeBitmap(String data, int width, int height) throws WriterException {
    MultiFormatWriter writer = new MultiFormatWriter();
    String finalData = Uri.encode(data);

    // Use 1 as the height of the matrix as this is a 1D Barcode.
    BitMatrix bm = writer.encode(finalData, BarcodeFormat.CODE_128, width, 1);
    int bmWidth = bm.getWidth();

    Bitmap imageBitmap = Bitmap.createBitmap(bmWidth, height, Config.ARGB_8888);

    for (int i = 0; i < bmWidth; i++) {
        // Paint columns of width 1
        int[] column = new int[height];
        Arrays.fill(column, bm.get(i, 0) ? Color.BLACK : Color.WHITE);
        imageBitmap.setPixels(column, 0, 1, i, 0, 1, height);
    }

    return imageBitmap;
}
Run Code Online (Sandbox Code Playgroud)

即使对于非常大的输出,这种方法也非常快,并且可以生成高质量的位图.


Gas*_*oin 6

您正在使用 QRCodeWriter。如果要编写其他类型的代码,请使用另一个 Writer。

勾选此MultiFormatWriter -它可以写任何类型的酒吧或查找特定的作家在这里的子文件夹(这是从斑马线库)