code39.cpp 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. #include "code39.h"
  2. QMap<QString,QString> InitMap()
  3. {
  4. // if(!map.isEmpty()) return;
  5. QMap<QString,QString> ret;
  6. ret.insert("A","110101001011");
  7. ret.insert("B","101101001011");
  8. ret.insert("C","110110100101");
  9. ret.insert("D","101011001011");
  10. ret.insert("E","110101100101");
  11. ret.insert("F","101101100101");
  12. ret.insert("G","101010011011");
  13. ret.insert("H","110101001101");
  14. ret.insert("I","101101001101");
  15. ret.insert("J","101011001101");
  16. ret.insert("K","110101010011");
  17. ret.insert("L","101101010011");
  18. ret.insert("M","110110101001");
  19. ret.insert("N","101011010011");
  20. ret.insert("O","110101101001");
  21. ret.insert("P","101101101001");
  22. ret.insert("Q","101010110011");
  23. ret.insert("R","110101011001");
  24. ret.insert("S","101101011001");
  25. ret.insert("T","101011011001");
  26. ret.insert("U","110010101011");
  27. ret.insert("V","100110101011");
  28. ret.insert("W","110011010101");
  29. ret.insert("X","100101101011");
  30. ret.insert("Y","110010110101");
  31. ret.insert("Z","100110110101");
  32. ret.insert("0","101001101101");
  33. ret.insert("1","110100101011");
  34. ret.insert("2","101100101011");
  35. ret.insert("3","110110010101");
  36. ret.insert("4","101001101011");
  37. ret.insert("5","110100110101");
  38. ret.insert("6","101100110101");
  39. ret.insert("7","101001011011");
  40. ret.insert("8","110100101101");
  41. ret.insert("9","101100101101");
  42. ret.insert("+","100101001001");
  43. ret.insert("-","100101011011");
  44. ret.insert("*","100101101101");
  45. ret.insert("/","100100101001");
  46. ret.insert("%","101001001001");
  47. ret.insert("$","100100100101");
  48. ret.insert(".","110010101101");
  49. ret.insert(" ","100110101101");
  50. return ret;
  51. }
  52. static QMap<QString,QString> map = InitMap();
  53. Code39::Code39()
  54. {
  55. // InitMap();
  56. }
  57. void Code39::draw(QPainter & painter, QRect & pos,QString & barcode)
  58. {
  59. QString BinaryNum = CodeBinary(barcode);
  60. int MAXHEIGHT = pos.height();
  61. int MAXWIDTH = pos.width();
  62. int FONTHEIGHT=10; //预留10px的左右空白;
  63. int widght = MAXWIDTH - FONTHEIGHT;
  64. //设定条码线条宽度px
  65. int LineWidth = widght / BinaryNum.size();
  66. int move= (MAXWIDTH-LineWidth*BinaryNum.size())/2;
  67. //QBitmap bmp(MAXWIDTH,MAXHEIGHT+FONTHEIGHT);
  68. // QPainter painter(&image);
  69. painter.save();
  70. // painter.setWindow(pos);
  71. QPen white,black;
  72. // painter.setRenderHint(QPainter::Antialiasing,true);//弧线圆润
  73. white.setColor(QColor(255,255,255));
  74. black.setColor(QColor(0,0,0));
  75. white.setWidth(LineWidth);
  76. black.setWidth(LineWidth);
  77. //背景充填白色
  78. painter.setPen(white);
  79. painter.drawRect(0,0,MAXWIDTH,MAXHEIGHT+FONTHEIGHT);
  80. //画线
  81. for(int i=0;i<BinaryNum.size();i++)
  82. {
  83. if(BinaryNum.at(i)=='1') painter.setPen(black);
  84. else painter.setPen(white);
  85. painter.drawLine(i*LineWidth+LineWidth/2+move,pos.top(),i*LineWidth+LineWidth/2+move,MAXHEIGHT);
  86. }
  87. // qDebug()<<barcode<<endl;
  88. //添加底部条形码字符
  89. painter.setPen(black);
  90. painter.setRenderHint(QPainter::Antialiasing,true);
  91. painter.setRenderHint(QPainter::TextAntialiasing,true);
  92. painter.setRenderHint(QPainter::HighQualityAntialiasing,true);
  93. QFont font;
  94. font.setFamily("宋体");
  95. font.setPixelSize(5*5);
  96. font.setWeight(QFont::ExtraLight);
  97. painter.setFont(font);
  98. painter.drawText(0*5,MAXHEIGHT+1,MAXWIDTH,17,Qt::AlignCenter,/*"S/N:" +*/ barcode);
  99. painter.restore();
  100. }
  101. /*
  102. QImage Code39::draw(QString BinaryNum,QString barcode)
  103. {
  104. int MAXWIDTH;
  105. int MAXHEIGHT=30;
  106. int FONTHEIGHT=10;
  107. //设定条码线条宽度px
  108. int LineWidth=1;
  109. //预留10px的左右空白;
  110. MAXWIDTH=LineWidth*BinaryNum.size()+5;
  111. //计算条线宽度时,精度丢失造成条码右边空白,进行右移居中
  112. int move=(MAXWIDTH-LineWidth*BinaryNum.size())/2;
  113. QSize size(MAXWIDTH,MAXHEIGHT+FONTHEIGHT);
  114. QImage image(size,QImage::Format_ARGB32);
  115. image.fill(qRgba(255, 255, 255, 0));
  116. //QBitmap bmp(MAXWIDTH,MAXHEIGHT+FONTHEIGHT);
  117. QPainter painter(&image);
  118. QPen white,black;
  119. // painter.setRenderHint(QPainter::Antialiasing,true);//弧线圆润
  120. white.setColor(QColor(255,255,255));
  121. black.setColor(QColor(0,0,0));
  122. white.setWidth(LineWidth);
  123. black.setWidth(LineWidth);
  124. //背景充填白色
  125. painter.setPen(white);
  126. painter.drawRect(0,0,MAXWIDTH,MAXHEIGHT+FONTHEIGHT);
  127. //画线
  128. for(int i=0;i<BinaryNum.size();i++)
  129. {
  130. if(BinaryNum.at(i)=='1') painter.setPen(black);
  131. else painter.setPen(white);
  132. painter.drawLine(i*LineWidth+LineWidth/2+move,0,i*LineWidth+LineWidth/2+move,MAXHEIGHT);
  133. }
  134. // qDebug()<<barcode<<endl;
  135. //添加底部条形码字符
  136. painter.setPen(black);
  137. painter.setRenderHint(QPainter::Antialiasing,true);
  138. painter.setRenderHint(QPainter::TextAntialiasing,true);
  139. painter.setRenderHint(QPainter::HighQualityAntialiasing,true);
  140. QFont font;
  141. font.setFamily("宋体");
  142. font.setPixelSize(10);
  143. font.setWeight(QFont::ExtraLight);
  144. painter.setFont(font);
  145. painter.drawText(5,30,MAXWIDTH,10,Qt::AlignCenter,"S/N:"barcode);
  146. // bool isSaved = image.save(path + barcode + ".bmp");
  147. // qDebug()<<isSaved;
  148. // return image;
  149. //}*/
  150. QString Code39::CodeBinary(QString barcode)
  151. {
  152. barcode="*"+barcode+"*";
  153. QString str="";
  154. for(int i=0;i<barcode.size();i++)
  155. {
  156. str+= map[barcode.at(i)]+"0";//每个字符的二进制逻辑码之间,用“0”隔开(加一条白线)
  157. }
  158. return str;
  159. }
  160. //void Code39::reset(QString BarCode, QString SavePath)
  161. //{
  162. //// barcode=BarCode;
  163. //// path=SavePath;
  164. //}