C#生成Code39(extend)条形码【非条形码字体】
Code39是条形码的一种。由于编制简单、能够对任意长度的数据进行编码、支持设备广泛等特性而被广泛采用。
- 能够对任意长度的数据进行编码。其局限在于印刷品的长度和条码阅读器的识别范围。
- 支持设备广泛。目前几乎所有的条形码阅读设备都能阅读Code39码,打印机也是同样情况。
- 编制简单。简单的开发技术就能快速生成相应的编码图像。
- 一般Code39码由5条线和分开它们的4条缝隙共9个元素构成。线和缝隙有宽窄之分,而且无论线还是缝隙仅有3个比其他的元素要宽一定比例。39码因此得名
Code39条形码规则
1、26个大写字母(A - Z),
2、十个数字(0 - 9),
3、连接号(-),句号(.),空格,美圆符号($),斜扛(/),加号(+)以及百分号(%)。
4、其余的输入将被忽略。
5、code39通常情况下不需要校验码。但是对於精确度要求高的应用,需要在code39条形码後面增加一个校验码。
/// <summary>
/// Code39一维码生成类
/// http://www.cnblogs.com/bluescreen/p/4689351.html
/// </summary>
public class CSharpCode39
{ #region 数据码
private byte[,] c39_bp = new byte[,] {
{ 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x30, 0x31, 0x30, 0x30 }, { 0x31, 0x31, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x31 }, { 0x32, 0x30, 0x30, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30, 0x31 }, { 0x33, 0x31, 0x30, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30 }, { 0x34, 0x30, 0x30, 0x30, 0x31, 0x31, 0x30, 0x30, 0x30, 0x31 }, { 0x35, 0x31, 0x30, 0x30, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30 }, { 0x36, 0x30, 0x30, 0x31, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30 }, { 0x37, 0x30, 0x30, 0x30, 0x31, 0x30, 0x30, 0x31, 0x30, 0x31 }, { 0x38, 0x31, 0x30, 0x30, 0x31, 0x30, 0x30, 0x31, 0x30, 0x30 }, { 0x39, 0x30, 0x30, 0x31, 0x31, 0x30, 0x30, 0x31, 0x30, 0x30 }, { 0x41, 0x31, 0x30, 0x30, 0x30, 0x30, 0x31, 0x30, 0x30, 0x31 }, { 0x42, 0x30, 0x30, 0x31, 0x30, 0x30, 0x31, 0x30, 0x30, 0x31 }, { 0x43, 0x31, 0x30, 0x31, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30 }, { 0x44, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x30, 0x30, 0x31 }, { 0x45, 0x31, 0x30, 0x30, 0x30, 0x31, 0x31, 0x30, 0x30, 0x30 }, { , 0x30, 0x30, 0x31, 0x30, 0x31, 0x31, 0x30, 0x30, 0x30 },
{ 0x47, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x30, 0x31 }, { 0x48, 0x31, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x30, 0x30 }, { 0x49, 0x30, 0x30, 0x31, 0x30, 0x30, 0x31, 0x31, 0x30, 0x30 }, { 0x4a, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x31, 0x30, 0x30 }, { 0x4b, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31 }, { 0x4c, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31 }, { 0x4d, 0x31, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x31, 0x30 }, { 0x4e, 0x30, 0x30, 0x30, 0x30, 0x31, 0x30, 0x30, 0x31, 0x31 }, { 0x4f, 0x31, 0x30, 0x30, 0x30, 0x31, 0x30, 0x30, 0x31, 0x30 }, { , 0x30, 0x30, 0x31, 0x30, 0x31, 0x30, 0x30, 0x31, 0x30 }, { 0x51, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x31 }, { 0x52, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x31, 0x30 }, { 0x53, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30, 0x31, 0x31, 0x30 }, { 0x54, 0x30, 0x30, 0x30, 0x30, 0x31, 0x30, 0x31, 0x31, 0x30 }, { 0x55, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31 }, { 0x56, 0x30, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31 },
{ 0x57, 0x31, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30 }, { 0x58, 0x30, 0x31, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30, 0x31 }, { 0x59, 0x31, 0x31, 0x30, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30 }, { , 0x30, 0x31, 0x31, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30 }, { 0x2d, 0x30, 0x31, 0x30, 0x30, 0x30, 0x30, 0x31, 0x30, 0x31 }, { 0x2e, 0x31, 0x31, 0x30, 0x30, 0x30, 0x30, 0x31, 0x30, 0x30 }, { 0x20, 0x30, 0x31, 0x31, 0x30, 0x30, 0x30, 0x31, 0x30, 0x30 }, { 0x2a, 0x30, 0x31, 0x30, 0x30, 0x31, 0x30, 0x31, 0x30, 0x30 }, { 0x24, 0x30, 0x31, 0x30, 0x31, 0x30, 0x31, 0x30, 0x30, 0x30 }, { 0x2f, 0x30, 0x31, 0x30, 0x31, 0x30, 0x30, 0x30, 0x31, 0x30 }, { 0x2b, 0x30, 0x31, 0x30, 0x30, 0x30, 0x31, 0x30, 0x31, 0x30 }, { 0x25, 0x30, 0x30, 0x30, 0x31, 0x30, 0x31, 0x30, 0x31, 0x30 }
};
//code39合法字符集 [0-9A-Z+-*/%. ] 共43个
private byte[] c39_cw = new byte[] {
0x30, 0x31, , 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, ,
0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, , 0x51, 0x52, 0x53, 0x54, 0x55, 0x56,
0x57, 0x58, 0x59, , 0x2d, 0x2e, 0x20, 0x24, 0x2f, 0x2b, 0x25
};
private byte[,] c39_ex = new byte[,] {
{ , 0x24, 0x41 }, { , 0x24, 0x42 }, { , 0x24, 0x43 }, { , 0x24, 0x44 }, { , 0x24, 0x45 }, { , 0x24, }, { , 0x24, 0x47 }, { , 0x24, 0x48 }, { , 0x24, 0x49 }, { , 0x24, 0x4a }, { , 0x24, 0x4b }, { , 0x24, 0x4c }, { , 0x24, 0x4d }, { , 0x24, 0x4e }, { , 0x24, 0x4f }, { 0x10, 0x24, },
{ 0x11, 0x24, 0x51 }, { 0x12, 0x24, 0x52 }, { 0x13, 0x24, 0x53 }, { , 0x24, 0x54 }, { 0x15, 0x24, 0x55 }, { 0x16, 0x24, 0x56 }, { 0x17, 0x24, 0x57 }, { 0x18, 0x24, 0x58 }, { 0x19, 0x24, 0x59 }, { 0x1a, 0x24, }, { 0x1b, 0x25, 0x41 }, { 0x1c, 0x25, 0x42 }, { 0x1d, 0x25, 0x43 }, { , 0x25, 0x44 }, { 0x1f, 0x25, 0x45 }, { 0x3b, 0x25, },
{ , 0x25, 0x47 }, { 0x3d, 0x25, 0x48 }, { 0x3e, 0x25, 0x49 }, { 0x3f, 0x25, 0x4a }, { 0x5b, 0x25, 0x4b }, { 0x5c, 0x25, 0x4c }, { 0x5d, 0x25, 0x4d }, { 0x5e, 0x25, 0x4e }, { 0x5f, 0x25, 0x4f }, { 0x7b, 0x25, }, { 0x7c, 0x25, 0x51 }, { 0x7d, 0x25, 0x52 }, { 0x7e, 0x25, 0x53 }, { 0x7f, 0x25, 0x54 }, { , 0x25, 0x55 }, { 0x40, 0x25, 0x56 },
{ 0x60, 0x25, 0x57 }, { 0x21, 0x2f, 0x41 }, { 0x22, 0x2f, 0x42 }, { 0x23, 0x2f, 0x43 }, { 0x26, 0x2f, }, { 0x27, 0x2f, 0x47 }, { , 0x2f, 0x48 }, { 0x29, 0x2f, 0x49 }, { 0x2a, 0x2f, 0x4a }, { 0x2c, 0x2f, 0x4c }, { 0x3a, 0x2f, }, { 0x61, 0x2b, 0x41 }, { 0x62, 0x2b, 0x42 }, { 0x63, 0x2b, 0x43 }, { , 0x2b, 0x44 }, { 0x65, 0x2b, 0x45 },
{ 0x66, 0x2b, }, { 0x67, 0x2b, 0x47 }, { 0x68, 0x2b, 0x48 }, { 0x69, 0x2b, 0x49 }, { 0x6a, 0x2b, 0x4a }, { 0x6b, 0x2b, 0x4b }, { 0x6c, 0x2b, 0x4c }, { 0x6d, 0x2b, 0x4d }, { , 0x2b, 0x4e }, { 0x6f, 0x2b, 0x4f }, { 0x70, 0x2b, }, { 0x71, 0x2b, 0x51 }, { 0x72, 0x2b, 0x52 }, { 0x73, 0x2b, 0x53 }, { 0x74, 0x2b, 0x54 }, { 0x75, 0x2b, 0x55 },
{ 0x76, 0x2b, 0x56 }, { 0x77, 0x2b, 0x57 }, { , 0x2b, 0x58 }, { 0x79, 0x2b, 0x59 }, { 0x7a, 0x2b, }
};
#endregion
#region 字段和属性 private bool _checksum;
private string _dataToEncode;
private bool _humanReadable;
private string _humanReadableFont;
private float _humanReadableSize;
private float _marginX;
private float _marginY;
private float _moduleHeight;
private float _moduleWidth;
private float _ratio;
private float _reduction;
private Color _codeBarColor = Color.Black;
private bool _isDisplayCheckCode;
private string _checkData;
private bool _isDisplayStartStopSign;
/// <summary>
/// 是否检查效验
/// </summary>
public bool Checksum
{
get
{
return _checksum;
}
set
{
_checksum = value;
}
} /// <summary>
/// 要进行编码的数据
/// </summary>
public string DataToEncode
{
get
{
return _dataToEncode;
}
set
{
_dataToEncode = value;
}
} /// <summary>
/// 是否显示文本内容
/// </summary>
public bool HumanReadable
{
get
{
return _humanReadable;
}
set
{
_humanReadable = value;
}
}
/// <summary>
/// 用于显示文本内容的字体
/// </summary>
public string HumanReadableFont
{
get
{
return _humanReadableFont;
}
set
{
_humanReadableFont = value;
}
}
/// <summary>
/// 用于显示文本内容文字的代大小
/// </summary>
public float HumanReadableSize
{
get
{
return _humanReadableSize;
}
set
{
_humanReadableSize = value;
}
} /// <summary>
/// 水平方向边距
/// 水平方向建议尽量留白
/// 如果没有留白同时模块宽度较小可能会造成无法识别
/// </summary>
public float MarginX
{
get
{
return _marginX;
}
set
{
_marginX = value;
}
}
/// <summary>
/// 垂直方向边距
/// </summary>
public float MarginY
{
get
{
return _marginY;
}
set
{
_marginY = value;
}
} /// <summary>
/// 模块高度(mm)
/// </summary>
public float ModuleHeight
{
get
{
return _moduleHeight;
}
set
{
_moduleHeight = value;
}
} /// <summary>
/// 模块宽度(mm)
/// 模块宽度不应低于0.2646f
/// 模块宽度过低会造成数据丢失因而读不出数据或者会误读
/// </summary>
public float ModuleWidth
{
get
{
return _moduleWidth;
}
set
{
_moduleWidth = value;
}
} /// <summary>
/// 放大比率
/// </summary>
public float Ratio
{
get
{
return _ratio;
}
set
{
_ratio = value;
}
}
/// <summary>
/// 缩小
/// </summary>
public float Reduction
{
get
{
return _reduction;
}
set
{
_reduction = value;
}
}
/// <summary>
/// 设置条形码的颜色
/// </summary>
public Color CodeBarColor
{
get
{
return _codeBarColor;
}
set
{
_codeBarColor = value;
}
} /// <summary>
/// 是否显示效验码
/// 此属性要在Checksum属性为true的情况下有用
/// </summary>
public bool IsDisplayCheckCode
{
get { return this._isDisplayCheckCode; }
set { this._isDisplayCheckCode = value; }
}
/// <summary>
/// 供人识别是否显示起止符
/// </summary>
public bool IsDisplayStartStopSign
{
get { return this._isDisplayStartStopSign; }
set { this._isDisplayStartStopSign = value; }
}
#endregion
/// <summary>
/// 默认构造函数
/// 初始化
/// </summary>
public CSharpCode39()
{
this.initData(); }
public CSharpCode39(string dataToEncode)
{
this.initData();
this._dataToEncode = dataToEncode;
}
/// <summary>
/// 默认构造函数
/// 初始化数据
/// </summary>
private void initData()
{
this._humanReadableFont = "Arial";
this._humanReadableSize = 10f;
this._codeBarColor = Color.Black;
this._moduleHeight = 15f;//模块高度毫米
this._moduleWidth = 0.35f;//模块宽度毫米
this._ratio = 3f;
this._marginX =;
this._marginY =;
this._checksum = true;
this._isDisplayCheckCode = false;
this._isDisplayStartStopSign = false;
}
private char[] _bitpattern_c39(string rawdata, ref int finalLength)
{
//0x27 39
//0x50 80
if ((rawdata.Length == ) || (rawdata.Length > 0x50 /*0x27*/))
{
return null;
}
for (int i = ; i < rawdata.Length; i++)
{
if ((rawdata[i] == '\0') || (rawdata[i] > '\x007f'))
{
return null;
}
}
byte[] data = processTilde(rawdata);
if (data.Length == )
{
return null;
}
byte[] buffer2 = this.processExtended(data);
if ((buffer2.Length == ) || (buffer2.Length > /**/))
{
return null;
}
finalLength = this._checksum ? ((buffer2.Length + ) + ) : (buffer2.Length + );
return this.getPattern_c39(buffer2);
} /// <summary>
/// 计算效验值
/// </summary>
/// <param name="data"></param>
/// <param name="len"></param>
/// <returns></returns>
private byte _checksum_c39(byte[] data, int len)
{
//0x2b 43
//字符值的总和除以合法字符集的个数43 取余数 余数在合法字符数组中对应的数值就是效验值
int num2 = ;
for (int i = ; i < len; i++)
{
num2 += this.valueFromCharacter(data[i]);
}
return this.c39_cw[num2 % 0x2b];
} private char[] Code39_bitpattern(string dataToEncode)
{
int finalLength = ;
return this._bitpattern_c39(dataToEncode, ref finalLength);
}
/// <summary>
/// 获得Code39条码图片
/// </summary>
/// <param name="resolution">DPI</param>
/// <returns></returns>
public Bitmap getBitmapImage(float resolution)
{
return Code39_createCode(resolution);
} private Bitmap Code39_createCode(float resolution)
{
int num6;
int finalLength = ;
char[] chArray = this._bitpattern_c39(DataToEncode, ref finalLength);
if (chArray == null)
{
return null;
}
float fontsize = this._humanReadable ? (0.3527778f * this._humanReadableSize) : 0f;
// float num3 = (7f * ModuleWidth) + ((3f * Ratio) * ModuleWidth);
float num3 = (7f * this._moduleWidth) + ((3f * this._ratio) * this._moduleWidth);
float width = (finalLength * num3) + (2f * this._marginX);
float height = (this._moduleHeight + (2f * this._marginY)) + fontsize;
width *= resolution / 25.4f;
height *= resolution / 25.4f;
Bitmap image = new Bitmap((int)width, (int)height, PixelFormat.Format32bppPArgb);
image.SetResolution(resolution, resolution);
//image.SetResolution(300, 300);
Graphics g = Graphics.FromImage(image);
g.Clear(Color.White);
g.PageUnit = GraphicsUnit.Millimeter; //以毫米为度量单位
g.FillRectangle(new SolidBrush(Color.White), new Rectangle(, , /*(int)width*/image.Width, /*(int)height*/image.Height));
//new Pen(Color.Black, 2f);
//new SolidBrush(Color.White);
SolidBrush brush = new SolidBrush(Color.Black);
if (resolution < 300f)
{
//g.TextRenderingHint = TextRenderingHint.AntiAlias;
//g.SmoothingMode = SmoothingMode.AntiAlias;
g.CompositingQuality = CompositingQuality.HighQuality;
//g.SmoothingMode = SmoothingMode.HighQuality;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
}
float num7 = 0f;
for (num6 = ; num6 < chArray.Length; num6++)
{
if (chArray[num6] == '')
{
if ((num6 & ) != )
{
RectangleF rect = new RectangleF(MarginX + num7, MarginY, ModuleWidth, ModuleHeight);
MakeBar(g, rect, Reduction);
}
num7 += 1f * ModuleWidth;
}
else
{
if ((num6 & ) != )
{
RectangleF ef2 = new RectangleF(MarginX + num7, MarginY, Ratio * ModuleWidth, ModuleHeight);
MakeBar(g, ef2, Reduction);
}
num7 += Ratio * ModuleWidth;
}
} #region 供人识别内容
if (this._humanReadable)
{
#region 保留
/*byte[] buffer2 = processTilde(this._dataToEncode);
int index = 0;
List<byte> arr = new List<byte>();
for (num6 = 0; num6 < buffer2.Length; num6++)
{
//0x20 32 0x7e 126
if ((buffer2[num6] >= 0x20) && (buffer2[num6] <= 0x7e))
{
arr.Add(buffer2[num6]);
}
}
byte[] bytes = new byte[arr.Count];
for (int i = 0; i < arr.Count; i++)
{
bytes[i] = arr[i];
}
index = arr.Count; //string text = new ASCIIEncoding().GetString(bytes, 0, index);
*/
#endregion
string text = this._dataToEncode;
if (this._isDisplayCheckCode&&!string.IsNullOrEmpty(this._checkData)) {
text += this._checkData;
}
if (this._isDisplayStartStopSign)
{
text = "*" + text + "*";
}
Font font = new Font(this._humanReadableFont, this._humanReadableSize);
//g.DrawString(text, font, brush, new PointF(MarginX, MarginY + ModuleHeight));
//新增字符串格式
var drawFormat = new StringFormat { Alignment = StringAlignment.Center };
float inpix = image.Width / resolution;//根据DPi求出 英寸数
float widthmm = inpix * 25.4f; //有每英寸像素求出毫米
//g.DrawString(text, font, Brushes.Black, width / 2, height - 14, drawFormat);
g.DrawString(text, font, /*Brushes.Black*/brush, new PointF(/*MarginX*/(int)(widthmm / ), MarginY + ModuleHeight + ), drawFormat); } #endregion return image;
} /// <summary>
/// 进行图形填充
/// </summary>
/// <param name="g"></param>
/// <param name="rect"></param>
/// <param name="reduction"></param>
private void MakeBar(Graphics g, RectangleF rect, float reduction)
{
MakeBar(g, rect, reduction,this._codeBarColor);
} /// <summary>
/// 进行图形填充
/// </summary>
/// <param name="g"></param>
/// <param name="rect"></param>
/// <param name="reduction"></param>
/// <param name="brushColor"></param>
private void MakeBar(Graphics g, RectangleF rect, float reduction, Color brushColor)
{
float num = rect.Width * (reduction / 200f);
float num2 = rect.Width - (rect.Width * (reduction / 200f)); RectangleF ef = new RectangleF
{
X = rect.X + num,
Y = rect.Y,
Width = num2,
Height = rect.Height
};
SolidBrush brush = new SolidBrush(brushColor);
g.FillRectangle(brush, ef); } private char[] getPattern_c39(byte[] data)
{ //0x2a 42为*
//int num = 0x27;
int num = ;
byte[] buffer = new byte[num + ];
buffer[] = 0x2a;
int index = ;
for (int i = ; i < data.Length; i++)
{
buffer[index] = data[i];
index++;
}
if (Checksum)
{
buffer[index] = this._checksum_c39(buffer, index);
if (_isDisplayCheckCode)
{
this._checkData = ((char)buffer[index]).ToString();
}
index++;
}
buffer[index] = 0x2a;
index++;
char[] chArray = new char[index * ];
int num5 = ;
for (int j = ; j < index; j++)
{
byte c = buffer[j];
int num9 = this.indexFromCharacter(c);
for (int k = ; k < ; k++)
{
chArray[num5] = (char)this.c39_bp[num9, k + ];
num5++;
}
chArray[num5] = '';
num5++;
}
return chArray;
} private int indexFromCharacter(byte c)
{
//0x2c==44
for (int i = ; i < 0x2c; i++)
{
if (this.c39_bp[i, ] == c)
{
return i;
}
}
return -;
} private byte[] processExtended(byte[] data)
{
//0x25 38
//0x4F 79 0x4E 78
//int num = 0x4F;
int num = data.Length - ;
byte[] sourceArray = new byte[num + ];
int index = ;
for (int i = ; i < data.Length; i++)
{
byte c = data[i];
if (this.valueFromCharacter(c) != -)
{
sourceArray[index] = c;
index++;
}
else
{
byte num5 = ;
byte num6 = ;
if (this.valuesFromExtended(c, ref num5, ref num6))
{
sourceArray[index] = num5;
sourceArray[index + ] = num6;
index += ;
}
}
}
byte[] destinationArray = new byte[index];
Array.Copy(sourceArray, destinationArray, index);
return destinationArray;
} /// <summary>
/// 返回指定字符在code39合法字符数组中对应的索引
/// </summary>
/// <param name="c"></param>
/// <returns></returns>
private int valueFromCharacter(byte c)
{
//c39_cw为数组,保存的为合法的字符集信息[0-9A-Z+-*/%. ] 共43个
//如果存在这个字符就返回c39_cw对应的索引
for (int i = ; i < /*0x2b*/this.c39_cw.Length; i++)
{
if (this.c39_cw[i] == c)
{
return i;
}
}
return -;
} /// <summary>
/// 判断字符集是否存在Extended
/// </summary>
/// <param name="c"></param>
/// <param name="v1"></param>
/// <param name="v2"></param>
/// <returns></returns>
private bool valuesFromExtended(byte c, ref byte v1, ref byte v2)
{
//0x55 85
for (int i = ; i < 0x55; i++)
{
if (this.c39_ex[i, ] == c)
{
v1 = this.c39_ex[i, ];
v2 = this.c39_ex[i, ];
return true;
}
}
return false;
} private byte[] processTilde(string rawdata)
{
byte[] sourceArray = new byte[rawdata.Length];
int index = ;
for (int i = ; i < rawdata.Length; i++)
{
if (rawdata[i] != '~')
{
sourceArray[index] = (byte)rawdata[i];
index++;
}
else if ((i + ) < rawdata.Length)
{
string str = new string(new char[] { rawdata[i + ], rawdata[i + ], rawdata[i + ] });
int num3 = Convert.ToInt32(str, );
if ((num3 > ) && (num3 <= 0xff))
{
sourceArray[index] = (byte)num3;
index++;
}
if (num3 == 0x3e7)
{
sourceArray[index] = 0x86;
index++;
}
i += ;
}
else
{
sourceArray[index] = (byte)rawdata[i];
index++;
}
}
byte[] destinationArray = new byte[index];
Array.Copy(sourceArray, destinationArray, index);
return destinationArray;
}
}
这个方法是根据DPI以及数据模块的高宽来确定条码的实际高宽。模块的宽度以毫米(mm)来算。类中的getBitmapImage方法的一个参数getBitmapImage为DPI。安卓用户安装平时常用的扫码软件即可做识别测试。就识别率来说还是可以的,扫描枪绝对是可以扫的出的。同时使用过MessagingToolkit.Barcode进行解码测试,万张无一误读。
在线解码网站:http://cli.im/deqr/、http://www.fbqr.com/desQR#
WinForm的例子下载:点击下载DEMO
C#生成Code39(extend)条形码【非条形码字体】的更多相关文章
- 【Demo】 生成二维码 和 条形码
条形码 和 二维码 对比 一维条形码只是在一个方向(一般是水平方向)表达信息,而在垂直方向则不表达任何信息,其一定的高度通常是为了便于阅读器的对准. 在水平和垂直方向的二维空间存储信息的条形码, 称为 ...
- 银行支票和汇票中使用的专用字体MICR E13B条形码控件字体
MICR E13B条形码控件字体是一种在美国.加拿大.波多黎各.巴拿马.英国和其它少数国家的银行支票和汇票中使用的专用字体,主要用来打印适用于磁性和光学字符识别系统的MICR字符.MICR E13B条 ...
- Android二维码开源项目zxing用例简化和生成二维码、条形码
上一篇讲到:Android二维码开源项目zxing编译,编译出来后有一个自带的測试程序:CaptureActivity比較复杂,我仅仅要是把一些不用的东西去掉,用看起来更方便,二维码和条形码的流行性自 ...
- iOS - 原生的CIFilter生成二维码和条形码
使用CIFilter可以不引入任何第三方库,就可以生成想要的二维码和条形码,今天简单的介绍一下使用CIFilter生成二维码和条形码.系统CIFilter生成的二维码和条形码的大小有时并不能满足需求, ...
- iOS8 生成二维码与条形码
iOS8 生成二维码与条形码 效果图: 源码: // // ViewController.m // CodeCreator // // Created by YouXianMing on 15/3/1 ...
- Office PPT保持提示无法保存Gill Sans 等非TrueType字体
升级office到最新版了 我有一天在做PPT,保存文件后提示保存:无法保存Gill Sans 等非TrueType字体 我知道PPT可以替换字体.于是使用替换字体功能,但是提示非TrueType不能 ...
- 在线生成CSS样式和兼容的字体格式
http://www.fontsquirrel.com/tools/webfont-generator 在线生成CSS样式和兼容的字体格式.
- 【174】C#添加非默认字体
参考:C# WinForm程序安装字体或直接调用非注册字体 参考:百度知道 在Debug文件夹下面新建一个font的文件夹,然后将字体的文件复制到里面,使用的时候,直接调用字体文件! private ...
- .net在网页中生成二维码和条形码
二维码: 1.下载ThoughtWorks.QRCode.dll文件 2.创建Web项目,添加引用刚才下载的文件 3.在项目中添加aspx窗体,编写代码如下 <%@ Page Language= ...
随机推荐
- Oracle数据库之创建表结构
Oracle数据库之创建表结构 主键与外键 主键:关系型数据库中的一条记录中有若干个属性,若其中的某一个属性组(可以是一个属性,也可以是多个)能唯一标识一条记录,那么该属性组就是主键. 外键:关系型数 ...
- jquery mobile将页面内容当成弹框进行显示
注:必须使用相对应版本的jquery mobile css.不然无法正常显示 <div data-role="page" id="pageone"> ...
- HTML5学习参考资料整理
给大家推荐一下学习研究HTML5必备的一些个网站,更加有利于大家对HTML5的学些和研究.如果各位童鞋还有更多的,欢迎投递资源给我们,也可以支持 我们,让我们利用大家的力量收集更多的HTML5学习资料 ...
- Nginx常用Rewrite伪静态法则
信赖此刻大部门用Linux VPS的伴侣都在利用这个敏捷传布的Nginx,本日就清算一下最常见的PHP法式的Rewrite(伪静态法则). Wordpress: location / {index i ...
- ADODB的应用
<?php include_once ('adodb5/adodb.inc.php'); $db = NewADOConnection ('mysql'); $db->Connect(&q ...
- JS函数定义与匿名函数的调用
一.函数声明.函数表达式.匿名函数 函数声明:function fnName () {…};使用function关键字 声明一个函数,再指定一个函数名,叫函数声明. 函数表达式 var fnName ...
- js识别终端类型
<script type="text/javascript"> function browserRedirect() { var sUserAgent= navigat ...
- 【docker】docker初试与填坑
docker是最近很流行的部署方式,最近尝试之前的项目都转移到docker上运行,下面是碰到的一些坑和解决方案. 网络问题 因为国内的原因,docker pull 镜像的时候经常碰到连不上或者速度极慢 ...
- Google Code Jam 2012 round 2 problem A: Swinging Wild
题目连接 题意:你要从起点经过绳子荡到终点,每次你必须抓住另一个绳子,在空中不能向下爬.问是否有合理的方案 做法: 直接模拟 #include <iostream> #include &l ...
- 使用MapReduce查询Hbase表指定列簇的全部数据输出到HDFS(一)
package com.bank.service; import java.io.IOException; import org.apache.hadoop.conf.Configuration;im ...