安卓生成EAN13

本文介绍了如何在Android应用中使用开源项目生成EAN13条形码,并对其进行定制,使其在下方显示文字信息。通过修改EAN13类,增加了_textHeight参数来调整条形码的样式,使得开始符、中间符和结束符之外的部分变短,并在下方以文本形式展示EAN13编码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从github找到了一个开源的项目(才疏学浅,不知道这个项目是什么开源协议): https://github.com/coolbong/android-barcode

这是项目中MainActivity中的关键代码。我不需要Code128,我需要的是EAN13。
private void drawBarcode() {
  String barcode = "7761010114033430";
  Code128 code = new Code128(this);
        code.setData(barcode);
        Bitmap bitmap = code.getBitmap(680, 300);
        ImageView ivBarcode = (ImageView)findViewById(R.id.code128_barcode);
        ivBarcode.setImageBitmap(bitmap);
 }

修改为:
private void drawBarcode() {
  /*String barcode = "7761010114033430";
  Code128 code = new Code128(this);*/
  String barcode="7200000018392";
  EAN13 code=new EAN13();
        code.setData(barcode);
        Bitmap bitmap = code.getBitmap(680, 300);
        ImageView ivBarcode = (ImageView)findViewById(R.id.code128_barcode);
        ivBarcode.setImageBitmap(bitmap);
 }
按提示导入:
import com.coolbong.barcodegenerator.model.EAN13;
运行效果:

解码试了一下,确实是EAN13,但是还是不是我想要的,我想要的是  开始符、中间符、结束符 长,其余的短,而且在下方显示 文字信息。
修改EAN13类,增加一个 _textHeight,当 _textHeight 大于 0  时  开始符、中间符、结束符 之外的变短 1.5 倍 _textHeight,并在下方输出 EAN13 的文本。
EAN13编码后为95个二进制,第 0、2、46、48、92、94为  开始符、中间符、结束符 对应的二进制。


增加了_textHeight成员、修改了构造函数、SetData、GetBitmap,修改部分注释中中文注出。
BarCodeActivity.java:
	private void drawBarcode() {
		/*String barcode = "7761010114033430";
		Code128 code = new Code128(this);*/
		String barcode="7200000018392";
		EAN13 code=new EAN13();
        code.setData(barcode,50/*增加传入的 textHeight 参数*/);
        Bitmap bitmap = code.getBitmap(680, 300);
        ImageView ivBarcode = (ImageView)findViewById(R.id.code128_barcode);
        ivBarcode.setImageBitmap(bitmap);
	}
EAN13.java:
<pre class="java" name="code">package com.coolbong.barcodegenerator.model;


import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Align;
import android.graphics.Rect;

public class EAN13 {

	private static final String TAG = EAN13.class.getSimpleName();

	private String data;
	//增加了成员
	private int _textHeight;
	public EAN13() {

	}

	//修改了构造函数
	public EAN13(String data,int text_Height){
		this.data = data;
		this._textHeight=text_Height;
	}
	//修改了
	public void setData(String data,int text_Height) {
		this.data = data;
		this._textHeight=text_Height;
	}

	public String getData() {
		return data;
	}


	public void init() {
		//data = null;
	}

	public byte[] initBuffer() {
		int sum = 0;

		//add start code 4byte
		sum = sum + 3;
		//add middle code 5byte
		sum = sum + 5;
		//add end code 4 byte
		sum = sum + 3;
		//add encoded data 7byte * 12
		sum = sum + (7 * 12);

		// sum = 11 + 11 + 12 + (11*dataLen);
		return new byte[sum];
	}



	public byte[] encode() {

		if(isVaildBarcodeData() == false) {
			android.util.Log.e(TAG, "invalid data length!!");
			return null;
		}
		
		int len = data.length();
		int pos = 0;

		init();
		byte[] buffer = initBuffer();

		int first_num = Integer.parseInt(data.substring(0, 1));
		byte[] patterns = EAN13Constant.FIRST_DIGIT[first_num];
		
		pos += appendData(EAN13Constant.START_PATTERN, buffer, pos, "START CODE");
		for(int i=1; i<len; i++) {
			int num = Integer.parseInt(data.substring(i, i+1));
			
			byte code = patterns[(i-1)];
			
			if(code == EAN13Constant.L_CODE) {
				pos += appendData(EAN13Constant.L_CODE_PATTERN[num], buffer, pos, "L code based number");
			} else if(code ==EAN13Constant.G_CODE) {
				pos += appendData(EAN13Constant.G_CODE_PATTERN[num], buffer, pos, "G code based number");
			} else { // R-code
				pos += appendData(EAN13Constant.R_CODE_PATTERN[num], buffer, pos, "R code based number");
			}
			
			if(i == 6) {
				pos += appendData(EAN13Constant.MIDDLE_PATTERN, buffer, pos, "MIDDLE CODE");
			}
		}
		
		pos += appendData(EAN13Constant.END_PATTERN, buffer, pos, "END CODE");

		return buffer;
	}



	public Bitmap getBitmap( int width, int height) {
		byte[] code = encode();
		
		if(code == null) {
			return null;
		}
		int inputWidth = code.length;
		// Add quiet zone on both sides
		int fullWidth = inputWidth + 6; // for empty(quiet) space
		int outputWidth = Math.max(width, fullWidth);
		int outputHeight = Math.max(1, height);

		int multiple = outputWidth / fullWidth;
		int leftPadding = (outputWidth - (inputWidth * multiple)) / 2;

		//BitMatrix output = new BitMatrix(outputWidth, outputHeight);
		Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
		Canvas canvas = new Canvas(bitmap);
		// new antialised Paint
		Paint bgPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
		// text color - #3D3D3D
		bgPaint.setColor(Color.rgb(255, 255, 255));

		Rect bounds = new Rect(0, 0, width, height);
		canvas.drawRect(bounds, bgPaint);

		Paint barPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
		barPaint.setColor(Color.rgb(0, 0, 0));
		barPaint.setStrokeWidth(0);
		
		//这里增加了8行代码
		Paint textPaint=new Paint(Paint.ANTI_ALIAS_FLAG);
		textPaint.setColor(Color.BLACK);
		textPaint.setTextAlign(Align.LEFT);
		textPaint.setTextSize(this._textHeight);
		canvas.drawText(this.data.substring(0,1),leftPadding-_textHeight*3/4,height, textPaint);
		textPaint.setTextAlign(Align.CENTER);
		canvas.drawText(this.data.substring(1,7),leftPadding+inputWidth * multiple/4,height, textPaint);
		canvas.drawText(this.data.substring(7,13),leftPadding+inputWidth * multiple*3/4,height, textPaint);</span>
		
		for (int inputX = 0, outputX = leftPadding; inputX < inputWidth; inputX++, outputX += multiple) {
			if (code[inputX] == 1) {
				//output.setRegion(outputX, 0, multiple, outputHeight);
				android.util.Log.e(TAG, "outputX: " + outputX + ", ouputY: 0, multiple: " + multiple + ", outputHeight: " + outputHeight);
				//canvas.drawRect(new Rect(outputX, 0, multiple, outputHeight), barPaint);
				//canvas.drawText(text, x, y, paint)
				//float left, float top, float right, float bottom
				//这里增加一个分支,让其余的缩短
				if(inputX!=0 && inputX!=2&& inputX!=46&& inputX!=48&& inputX!=92&& inputX!=94)
					canvas.drawRect(outputX, 0, (outputX+multiple), outputHeight-_textHeight*3/2, barPaint);
				else
					canvas.drawRect(outputX, 0, (outputX+multiple), outputHeight, barPaint);
			}
		}
		return bitmap;
	}

	public int getSum() {
		return getSum();
	}

	public boolean isVaildBarcodeData() {
		if(data == null) {
			return false;
		}
		
		if(data.length() != 13) {
			return false;
		}
		
		if(checkNumber(data) == false) {
			return false;
		}
		
		return true;
	}


	private static boolean checkNumber(String data) {
		int len = data.length();

		for(int i=0; i<len; i++ ) {
			char ch = data.charAt(i);
			if (ch < '0' || ch > '9') {
				//if((ch < 48)  || (ch > 57)) {
				return false;
			}
		}

		return true;
	}

	private int appendData(byte[] src, byte[] dst, int pos, String debugdata) {

		System.arraycopy(src, 0, dst, pos, src.length);

		if(debugdata != null)  {
			printByteArr(debugdata, src);
		}

		return src.length;
	}

	private void printByteArr(String msg, byte[] buff) {
		if(buff == null) {
			return;
		}

		StringBuilder sb = new StringBuilder();
		for(byte by: buff) {
			sb.append(by);
		}
		android.util.Log.e(TAG, "char: " + msg + " barcode weight: " + sb.toString());
	}

}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值