web-dev-qa-db-ja.com

Android Zxingを使用してQRコードとバーコードを生成

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(); 
    }
}

今、私の質問は、同じライブラリを使用してbar codeを取得する方法です。bar codesに関連するいくつかのファイルを見ましたが、それを行う方法がわかりません。アプリケーション内でbar codeを生成し、web serviceを呼び出さないようにしたいので。私はすでにzxingを使用しているので、itextおよびbarbecue jarsを含めても意味がありません。

13
Ciff

QRCodeWriterを使用しています。別のタイプのコードを記述したい場合は、別のライターを使用してください。

これをチェックしてください MultiFormatWriter -任意のタイプのバーを書き込むか、特定のライターを見つけることができます ここ サブフォルダーにあります(これはzxingライブラリからのものです)

5
Gaskoin

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(); 
        }
9
Ciff

受け入れられた回答をテストしてバーコードを生成しましたが、出力は ぼやけた 大きなImageViewで使用した場合。高品質の出力を得るには、  BitMatrix、Bitmap、最終的なImageViewは同じでなければなりません。ただし、受け入れられた回答を使用してこれを行うと、バーコードの生成が非常に遅くなります(2〜3秒)。これは

Bitmap.setPixel()

遅い操作であり、受け入れられた答えはその操作を集中的に使用しています(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;
}

このアプローチは 非常に大きな出力でも非常に高速で、高品質のビットマップを生成します

8
Iván Martínez

はい、どうぞ

public static Bitmap createBarCode (String codeData, BarcodeFormat barcodeFormat, int codeHeight, int codeWidth) {

    try {
        Hashtable<EncodeHintType, ErrorCorrectionLevel> hintMap = new Hashtable<EncodeHintType, ErrorCorrectionLevel> ();
        hintMap.put (EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);

        Writer codeWriter;
        if (barcodeFormat == BarcodeFormat.QR_CODE) {
            codeWriter = new QRCodeWriter ();
        } else if (barcodeFormat == BarcodeFormat.CODE_128) {
            codeWriter = new Code128Writer ();
        } else {
            throw new RuntimeException ("Format Not supported.");
        }

        BitMatrix byteMatrix = codeWriter.encode (
            codeData,
            barcodeFormat,
            codeWidth,
            codeHeight,
            hintMap
        );

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

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

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

        return imageBitmap;

    } catch (WriterException e) {
        e.printStackTrace ();
        return null;
    }
}

もちろん、必要な数のBarcodeFormatをサポートできます。ここでコンストラクタを変更するだけです。

Writer codeWriter;
if (barcodeFormat == BarcodeFormat.QR_CODE) {
    codeWriter = new QRCodeWriter ();
} else if (barcodeFormat == BarcodeFormat.CODE_128) {
    codeWriter = new Code128Writer ();
} else {
    throw new RuntimeException ("Format Not supported.");
}
2
user1079425

このコードを試してください

Context context = getActivity();
Intent intent = new Intent("com.google.zxing.client.Android.ENCODE");
intent.putExtra("ENCODE_TYPE", Text);
intent.putExtra("ENCODE_DATA", "12345678901");
intent.putExtra("ENCODE_FORMAT", "UPC_A");
startActivity(intent);

これがお役に立てば幸いです。

0
i.n.e.f