安卓生成EAN13

来源:互联网 发布:php面向对象的封装 编辑:程序博客网 时间:2024/06/06 16:27
从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 4bytesum = sum + 3;//add middle code 5bytesum = sum + 5;//add end code 4 bytesum = sum + 3;//add encoded data 7byte * 12sum = 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-codepos += 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 sidesint fullWidth = inputWidth + 6; // for empty(quiet) spaceint 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 PaintPaint bgPaint = new Paint(Paint.ANTI_ALIAS_FLAG);// text color - #3D3D3DbgPaint.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);elsecanvas.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());}}





1 0
原创粉丝点击