Ответ 1
Вы используете QRCodeWriter. Если вы хотите написать другой тип кода, используйте другой Writer.
Отметьте MultiFormatWriter - он может писать любой тип бара или находить конкретных авторов здесь в подпапках (это из библиотеки zxing)
Код для генерации Qr-кода с использованием zxing --- ---
Он принимает строковые данные и 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
Вы используете QRCodeWriter. Если вы хотите написать другой тип кода, используйте другой Writer.
Отметьте MultiFormatWriter - он может писать любой тип бара или находить конкретных авторов здесь в подпапках (это из библиотеки zxing)
Как сказал Гаскойн... 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();
}
Я тестировал принятый ответ для создания штрих-кода, но при использовании в большом ImageView результат размытый. Чтобы получить высококачественный вывод, ширина width для BitMatrix, растрового изображения и окончательного ImageView должна быть одинаковой. Но сделать это с помощью принятого ответа приведет к тому, что генерация штрих-кода будет очень медленной (2-3 секунды). Это происходит потому, что
Bitmap.setPixel()
- медленная операция, и принятый ответ интенсивно использует эту операцию (2 вложенных для циклов).
Чтобы преодолеть эту проблему, я немного изменил алгоритм генерации Bitmap (используйте его только для генерации штрих-кода), чтобы использовать 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;
}
Этот подход очень быстрый даже для действительно больших выходов и генерирует высококачественную растровую карту.
Там вы идете,
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);
надеюсь, что это поможет вам.