Android使用Zxing生成QR代码和条形码

使用zxing生成qr码的代码是—

它需要string数据和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烧烤jar中没有任何意义

Solutions Collecting From Web of "Android使用Zxing生成QR代码和条形码"

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

检查这MultiFormatWriter – 它可以写任何types的栏或find特定的作家在这里的子文件夹(这是从zxing库)

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

我已经testing了接受的答案来生成一个条形码,但是当在一个大的ImageView中使用时,输出是模糊的 。 为了获得高质量的输出,BitMatrix的宽度 ,位图和最终的ImageView应该是相同的。 但使用接受的答案这样做将使条码生成真的很慢(2-3秒)。 这是因为

 Bitmap.setPixel() 

是一个缓慢的操作,并且接受的答案是大量使用该操作(2个嵌套for循环)。

为了克服这个问题,我修改了一些位图生成algorithm(仅用于生成条形码),以便使用Bitmap.setPixels(),该algorithm速度更快:

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

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

你去了,

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

当然,您可以根据需要支持任意数量的BarcodeFormats,只需在此处更改构造函数:

 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."); } 

试试这个代码

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

希望这可以帮助你。