Java如何生成Code128C条形码

Code128C条形码介绍

Code128条形码(分为A、B、C三种格式):
具体信息参阅条码标准;

  • Code128C 的优势
    Code128C可容纳数据长度与Code128标准一致;
    Code128C条形码相比同数据量的Code128A、B,条码更短(显示、打印具有独特的优势)。
  • Code128C 的局限
    Code128C 条码只能容纳0~9的数字字符;
    Code128C 条码只能容纳偶数位长度字符。
  • Code128C 的结构
    Code128C和其他条码一样,居右头标记、校验位、尾标记;
    数据段以每两位字符为一个数据单位进行编码。
    -Code128C 生成原理
    根据编码规则,处理数据,每两位为一个数据元素,切记偶数位长度纯数字字符才能生成Code128C条形码!!

Java生成Code128C条码图片(Bitmap)

import android.graphics.Bitmap;
import android.graphics.Color;
public class CodeCreater128C {

    /**
     * 生成Code128C格式条形码(纯数字,偶数位长度)
     * 
     * @param content 条码内容(偶数位纯数字内容)
     * @param widthScale(1-10, 默认2,)
     * @param height 条码高度(40-200,默认100)
     * @return
     */
    public static Bitmap create128CBitmap(String content, int widthScale, int height) {
        if (content == null || content.length() == 0) {
            return null;
        }
        if (height<40||height>200) {
            height = 100;
        }
        if ((content.length() % 2) == 1) {
            return null;
        }
        for (int i = 0; i < content.length(); i++) {
            char charFlag = content.charAt(i);
            if (charFlag > 57 || charFlag < 48) {
                return null;
            }
        }
        String text = CodeSymbol128C.SYMBOL_START_C.getSymbolValue(); // 获取开始位
        int examine = 105;
        int count = 0;
        while (content.length() != 0) {
            int tempValue = Integer.valueOf(content.subSequence(0, 2).toString());
            text += CodeSymbol128C.getTargetSymbolValue(tempValue);
            examine += tempValue * ++count;
            content = content.substring(2);
        }
        examine = examine % 103; // 获得严效位
        text += CodeSymbol128C.getTargetSymbolValue(examine); // 获取严效位
        text += CodeSymbol128C.SYMBOL_STOP.getSymbolValue(); // 结束位

        return getImageFrom128CSymbols(text, widthScale, height);

    }

    private static Bitmap getImageFrom128CSymbols(String symbolsStr, int barSizeScale, int bitmapHeight) {
        if (barSizeScale < 1 || barSizeScale > 8) {
            barSizeScale = 2;
        }
        byte[] symbols = symbolsStr.getBytes();

        int width = 0;
        for (int i = 0; i < symbols.length; i++) {
            width += (symbols[i] - 48) * barSizeScale;
        }
        Bitmap barCodeBitmap = Bitmap.createBitmap(width, bitmapHeight, Bitmap.Config.ARGB_8888);
        int offset = 0;
        for (int i = 0; i < symbols.length; i++) {
            int barElementWidth = (symbols[i] - 48) * barSizeScale; // 获取元素宽度
            if (!((i & 1) == 0)) { // 偶数位
                for (int j = 0; j < barElementWidth; j++) {
                    // 图元列循环
                    for (int k = 0; k < bitmapHeight; k++) {
                        // 图元列像素循环
                        barCodeBitmap.setPixel((offset + j), k, Color.WHITE);
                    }
                }
            } else {
                // 奇数位
                for (int j = 0; j < barElementWidth; j++) {
                    // 图元列循环
                    for (int k = 0; k < bitmapHeight; k++) {
                        // 图元列像素循环
                        barCodeBitmap.setPixel((offset + j), k, Color.BLACK);
                    }
                }
            }
            // _Garphics.(_Pen, new Point(_LenEx, 0), new Point(_LenEx,
            // m_Height));
            offset += barElementWidth;
        }
        return barCodeBitmap;
    }

    private enum CodeSymbol128C {
        SYMBOL_00(0, "212222"), 
        SYMBOL_01(1, "222122"), 
        SYMBOL_02(2, "222221"), 
        SYMBOL_03(3, "121223"), 
        SYMBOL_04(4, "121322"), 
        SYMBOL_05(5, "131222"), 
        SYMBOL_06(6, "122213"), 
        SYMBOL_07(7, "122312"), 
        SYMBOL_08(8, "132212"), 
        SYMBOL_09(9, "221213"), 
        SYMBOL_10(10, "221312"), 
        SYMBOL_11(11, "231212"), 
        SYMBOL_12(12, "112232"), 
        SYMBOL_13(13, "122132"), 
        SYMBOL_14(14, "122231"), 
        SYMBOL_15(15, "113222"), 
        SYMBOL_16(16, "123122"), 
        SYMBOL_17(17, "123221"), 
        SYMBOL_18(18, "223211"), 
        SYMBOL_19(19, "221132"), 
        SYMBOL_20(20, "221231"), 
        SYMBOL_21(21, "213212"), 
        SYMBOL_22(22, "223112"), 
        SYMBOL_23(23, "312131"), 
        SYMBOL_24(24, "311222"), 
        SYMBOL_25(25, "321122"), 
        SYMBOL_26(26, "321221"), 
        SYMBOL_27(27, "312212"), 
        SYMBOL_28(28, "322112"), 
        SYMBOL_29(29, "322211"), 
        SYMBOL_30(30, "212123"), 
        SYMBOL_31(31, "212321"), 
        SYMBOL_32(32, "232121"), 
        SYMBOL_33(33, "111323"), 
        SYMBOL_34(34, "131123"), 
        SYMBOL_35(35, "131321"), 
        SYMBOL_36(36, "112313"), 
        SYMBOL_37(37, "132113"), 
        SYMBOL_38(38, "132311"), 
        SYMBOL_39(39, "211313"), 
        SYMBOL_40(40, "231113"), 
        SYMBOL_41(41, "231311"), 
        SYMBOL_42(42, "112133"), 
        SYMBOL_43(43, "112331"), 
        SYMBOL_44(44, "132131"), 
        SYMBOL_45(45, "113123"), 
        SYMBOL_46(46, "113321"), 
        SYMBOL_47(47, "133121"), 
        SYMBOL_48(48, "313121"), 
        SYMBOL_49(49, "211331"), 
        SYMBOL_50(50, "231131"), 
        SYMBOL_51(51, "213113"), 
        SYMBOL_52(52, "213311"), 
        SYMBOL_53(53, "213131"), 
        SYMBOL_54(54, "311123"), 
        SYMBOL_55(55, "311321"), 
        SYMBOL_56(56, "331121"), 
        SYMBOL_57(57, "312113"), 
        SYMBOL_58(58, "312311"), 
        SYMBOL_59(59, "332111"), 
        SYMBOL_60(60, "314111"), 
        SYMBOL_61(61, "221411"), 
        SYMBOL_62(62, "431111"), 
        SYMBOL_63(63, "111224"), 
        SYMBOL_64(64, "111422"), 
        SYMBOL_65(65, "121124"), 
        SYMBOL_66(66, "121421"), 
        SYMBOL_67(67, "141122"), 
        SYMBOL_68(68, "141221"), 
        SYMBOL_69(69, "112214"), 
        SYMBOL_70(70, "112412"), 
        SYMBOL_71(71, "122114"), 
        SYMBOL_72(72, "122411"), 
        SYMBOL_73(73, "142112"), 
        SYMBOL_74(74, "142211"), 
        SYMBOL_75(75, "241211"), 
        SYMBOL_76(76, "221114"), 
        SYMBOL_77(77, "413111"), 
        SYMBOL_78(78, "241112"), 
        SYMBOL_79(79, "134111"), 
        SYMBOL_80(80, "111242"), 
        SYMBOL_81(81, "121142"), 
        SYMBOL_82(82, "121241"), 
        SYMBOL_83(83, "114212"), 
        SYMBOL_84(84, "124112"), 
        SYMBOL_85(85, "124211"), 
        SYMBOL_86(86, "411212"), 
        SYMBOL_87(87, "421112"), 
        SYMBOL_88(88, "421211"), 
        SYMBOL_89(89, "212141"), 
        SYMBOL_90(90, "214121"), 
        SYMBOL_91(91, "412121"), 
        SYMBOL_92(92, "111143"), 
        SYMBOL_93(93, "111341"), 
        SYMBOL_94(94, "131141"), 
        SYMBOL_95(95, "114113"), 
        SYMBOL_96(96, "114311"), 
        SYMBOL_97(97, "411113"), 
        SYMBOL_98(98, "411311"), 
        SYMBOL_99(99, "113141"),
        // 以下为标志位
        SYMBOL_START_A(103, "211412"), 
        SYMBOL_START_B(104, "211214"), 
        SYMBOL_START_C(105, "211232"), 
        SYMBOL_STOP(106, "2331112");

        private int codeValue;
        private String symbolValue;

        private CodeSymbol128C(int codeValue, String symbolValue) {
            this.codeValue = codeValue;
            this.symbolValue = symbolValue;
        }

        public String getSymbolValue() {
            return this.symbolValue;
        }

        public static String getTargetSymbolValue(int codeValue) {
            return CodeSymbol128C.valueOf("SYMBOL_" + (codeValue < 10 ? "0" : "") + codeValue).getSymbolValue();
        }

        }
    }

参考文章:C语言生成Code128A、B、C

你可能感兴趣的:(Android,Java)