條碼 CODE 128 |
|
a0953329718
一般會員 發表:1 回覆:0 積分:0 註冊:2010-12-09 發送簡訊給我 |
void __fastcall GetCode128(AnsiString strSource,TCanvas *img, int Top, int Left , int Height ,int Dpi) { if (strSource.IsEmpty()) return ; double Ratio ; //算出比例 以 解析 100為基準 if (Dpi > 0) Ratio=Dpi/100.0; else Ratio=1; int x = Top*Ratio; //左邊界 int y = Left*Ratio; //上邊界 int BarCodeHeight = Height*Ratio; //BarCode高度 int ichecksum; //檢查值 int idx, icodeword_pos; AnsiString AlphaBet_A = " !\"#$%&'()* ,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\^_]" ; //Code A 的 AnsiString AlphaBet_B = " !\"#$%&'()* ,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\^_]`abcdefghijklmnopqrstuvwxyz{|}~"; //Code B 的 AnsiString Code128[103] = //Code128對應碼 { /*a:' '; b:' '; c:'00'*/ "11011001100", /*a:'!'; b:'!'; c:'01'*/ "11001101100", /*a:'"'; b:'"'; c:'02'*/ "11001100110", /*a:'#'; b:'#'; c:'03'*/ "10010011000", /*a:'$'; b:'$'; c:'04'*/ "10010001100", /*a:'%'; b:'%'; c:'05'*/ "10001001100", /*a:'&'; b:'&'; c:'06'*/ "10011001000", /*a:"'"; b:"'"; c:'07'*/ "10011000100", /*a:'('; b:'('; c:'08'*/ "10001100100", /*a:')'; b:')'; c:'09'*/ "11001001000", /*a:'*'; b:'*'; c:'10'*/ "11001000100", /*a:' '; b:' '; c:'11'*/ "11000100100", /*a:'’'; b:'’'; c:'12'*/ "10110011100", /*a:'-'; b:'-'; c:'13'*/ "10011011100", /*a:'.'; b:'.'; c:'14'*/ "10011001110", /*a:'/'; b:'/'; c:'15'*/ "10111001100", /*a:'0'; b:'0'; c:'16'*/ "10011101100", /*a:'1'; b:'1'; c:'17'*/ "10011100110", /*a:'2'; b:'2'; c:'18'*/ "11001110010", /*a:'3'; b:'3'; c:'19'*/ "11001011100", /*a:'4'; b:'4'; c:'20'*/ "11001001110", /*a:'5'; b:'5'; c:'21'*/ "11011100100", /*a:'6'; b:'6'; c:'22'*/ "11001110100", /*a:'7'; b:'7'; c:'23'*/ "11101101110", /*a:'8'; b:'8'; c:'24'*/ "11101001100", /*a:'9'; b:'9'; c:'25'*/ "11100101100", /*a:':'; b:':'; c:'26'*/ "11100100110", /*a:';'; b:';'; c:'27'*/ "11101100100", /*a:'<'; b:'<'; c:'28'*/ "11100110100", /*a:'='; b:'='; c:'29'*/ "11100110010", /*a:'>'; b:'>'; c:'30'*/ "11011011000", /*a:'?'; b:'?'; c:'31'*/ "11011000110", /*a:'@'; b:'@'; c:'32'*/ "11000110110", /*a:'A'; b:'A'; c:'33'*/ "10100011000", /*a:'B'; b:'B'; c:'34'*/ "10001011000", /*a:'C'; b:'C'; c:'35'*/ "10001000110", /*a:'D'; b:'D'; c:'36'*/ "10110001000", /*a:'E'; b:'E'; c:'37'*/ "10001101000", /*a:'F'; b:'F'; c:'38'*/ "10001100010", /*a:'G'; b:'G'; c:'39'*/ "11010001000", /*a:'H'; b:'H'; c:'40'*/ "11000101000", /*a:'I'; b:'I'; c:'41'*/ "11000100010", /*a:'J'; b:'J'; c:'42'*/ "10110111000", /*a:'K'; b:'K'; c:'43'*/ "10110001110", /*a:'L'; b:'L'; c:'44'*/ "10001101110", /*a:'M'; b:'M'; c:'45'*/ "10111011000", /*a:'N'; b:'N'; c:'46'*/ "10111000110", /*a:'O'; b:'O'; c:'47'*/ "10001110110", /*a:'P'; b:'P'; c:'48'*/ "11101110110", /*a:'Q'; b:'Q'; c:'49'*/ "11010001110", /*a:'R'; b:'R'; c:'50'*/ "11000101110", /*a:'S'; b:'S'; c:'51'*/ "11011101000", /*a:'T'; b:'T'; c:'52'*/ "11011100010", /*a:'U'; b:'U'; c:'53'*/ "11011101110", /*a:'V'; b:'V'; c:'54'*/ "11101011000", /*a:'W'; b:'W'; c:'55'*/ "11101000110", /*a:'X'; b:'X'; c:'56'*/ "11100010110", /*a:'Y'; b:'Y'; c:'57'*/ "11101101000", /*a:'Z'; b:'Z'; c:'58'*/ "11101100010", /*a:'['; b:'['; c:'59'*/ "11100011010", /*a:'\'; b:'\'; c:'60'*/ "11101111010", /*a:']'; b:']'; c:'61'*/ "11001000010", /*a:'^'; b:'^'; c:'62'*/ "11110001010", /*a:'_'; b:'_'; c:'63'*/ "10100110000", /*a:' '; b:'`'; c:'64'*/ "10100001100", /*a:' '; b:'a'; c:'65'*/ "10010110000", /*a:' '; b:'b'; c:'66'*/ "10010000110", /*a:' '; b:'c'; c:'67'*/ "10000101100", /*a:' '; b:'d'; c:'68'*/ "10000100110", /*a:' '; b:'e'; c:'69'*/ "10110010000", /*a:' '; b:'f'; c:'70'*/ "10110000100", /*a:' '; b:'g'; c:'71'*/ "10011010000", /*a:' '; b:'h'; c:'72'*/ "10011000010", /*a:' '; b:'i'; c:'73'*/ "10000110100", /*a:' '; b:'j'; c:'74'*/ "10000110010", /*a:' '; b:'k'; c:'75'*/ "11000010010", /*a:' '; b:'l'; c:'76'*/ "11001010000", /*a:' '; b:'m'; c:'77'*/ "11110111010", /*a:' '; b:'n'; c:'78'*/ "11000010100", /*a:' '; b:'o'; c:'79'*/ "10001111010", /*a:' '; b:'p'; c:'80'*/ "10100111100", /*a:' '; b:'q'; c:'81'*/ "10010111100", /*a:' '; b:'r'; c:'82'*/ "10010011110", /*a:' '; b:'s'; c:'83'*/ "10111100100", /*a:' '; b:'t'; c:'84'*/ "10011110100", /*a:' '; b:'u'; c:'85'*/ "10011110010", /*a:' '; b:'v'; c:'86'*/ "11110100100", /*a:' '; b:'w'; c:'87'*/ "11110010100", /*a:' '; b:'x'; c:'88'*/ "11110010010", /*a:' '; b:'y'; c:'89'*/ "11011011110", /*a:' '; b:'z'; c:'90'*/ "11011110110", /*a:' '; b:'{'; c:'91'*/ "11110110110", /*a:' '; b:'|'; c:'92'*/ "10101111000", /*a:' '; b:'}'; c:'93'*/ "10100011110", /*a:' '; b:'~'; c:'94'*/ "10001011110", /*a:' '; b:' '; c:'95'*/ "10111101000", /*a:' '; b:' '; c:'96'*/ "10111100010", /*a:' '; b:' '; c:'97'*/ "11110101000", /*a:' '; b:' '; c:'98'*/ "11110100010", /*a:' '; b:' '; c:'99'*/ "10111011110", //A轉C , B轉C , 99 /*a:' '; b:' '; c:' '*/ "10111011110", //A轉B , F4 , C轉B /*a:' '; b:' '; c:' '*/ "11101011110", //F4 , B轉A , C轉A /*a:' '; b:' '; c:' '*/ "11110101110" //F1 }; AnsiString CODEA = "11010000100"; //起始碼 CODE A AnsiString CODEB = "11010010000"; //起始碼 CODE B AnsiString CODEC = "11010011100"; //起始碼 CODE C AnsiString strend = "1100011101011"; //終止碼有13線 AnsiString strStar = ""; AnsiString strEncode=""; //先判斷要用 CODE A , B , C /* 1. 一開始數字連續4個以上時,使用C類。 2. 先遇上ASCII 0~31者,使用A類,先遇上ASCII 96~127者,使用B類。都遇不上,一律採用A類。 */ if (strSource.Length() > 0) //判斷是不是空的 { strStar = ""; //決定用哪一種CODE if (TryStrToFloat(strSource) && (strSource.Length() % 2 == 0)) //數字且長度為雙數的用CODE C strStar = CODEC; else { for (int i = 1; i <= strSource.Length(); i ) { //檢查是不是含有 ASCII 96~127 用 CODE B char a = strSource[i] ; int iTmp=a; if (iTmp >= 96 && iTmp <= 127) strStar = CODEB; } if (strStar == "") strStar = CODEA; //都不符合用 CODE A } } /* 檢查碼初始值 Code A = 103 Code B = 104 Code C = 105 */ if (strStar == CODEC) { //CODE C 的做法 strEncode = strStar; //給啟始碼 ichecksum = 105; // ex:1234 ichecksum = (105 12*1 34*2) % 103 idx = 0; icodeword_pos = 1; for (int i = 0; i < strSource.Length() / 2; i ) //CODE C 是一次2碼 { idx = StrToInt(strSource.SubString((i * 2) 1, 2)); //取2碼 EX:1234 分成 12跟34 取 strEncode = strEncode Code128[idx]; //換成條碼 編碼值 ichecksum = ichecksum idx * icodeword_pos; //算檢查值 icodeword_pos = icodeword_pos 1; } strEncode = strEncode Code128[ichecksum % 103] strend; //加上檢查值與結束字串 } else { //由CODE 類別帶出 初始 檢查值 if (strStar == CODEA) ichecksum = 103; //CODE A else if (strStar == CODEB) ichecksum = 104; //CODE B else ichecksum = 0; strEncode = strStar; //給啟始碼 idx = 0; icodeword_pos = 1; AnsiString sstmp; for (int i = 1; i <= strSource.Length() ; i ) { sstmp=strSource.SubString(i, 1); if (strStar == CODEA) //查字元位置 idx = AlphaBet_A.Pos(sstmp); //CODE A else idx = AlphaBet_B.Pos(sstmp); //CODE B strEncode = strEncode Code128[idx-1]; //由位置 換成條碼 編碼值 ichecksum = ichecksum idx * icodeword_pos; //算檢查值 icodeword_pos = icodeword_pos 1; } strEncode = strEncode Code128[ichecksum % 103] strend; //加上檢查值與結束字串 } int intEncodeLength = strEncode.Length(); //編碼後長度 img->Brush->Style = bsSolid; img->Brush->Color=clWhite; img->Pen->Color=clWhite; img->Rectangle(0,0,(1*intEncodeLength) (x*2) 2,BarCodeHeight (y * 2)); for (int i = 1; i <= intEncodeLength; i ) //依碼畫出BarCode { if (strEncode.SubString(i, 1)==1) { //黑色的 線 img->Brush->Color=clBlack; img->Pen->Color=clBlack; } else { //白色的 img->Brush->Color=clWhite; img->Pen->Color=clWhite; } img->Rectangle( x, y, x (1*Ratio), BarCodeHeight); x =x 1*Ratio; } } [/code] |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |