public class Barcode
{
public Bitmap CreateBarcode(string data)
{
string barcodeData = "*" + data + "*";
Bitmap barcode = new Bitmap(1, 1);
// less than size 40, my barcode reader can not read it.
Font threeOfNine = new Font("Free 3 of 9", 40,
System.Drawing.FontStyle.Regular,
System.Drawing.GraphicsUnit.Point);
Font arial = new Font("Arial", 15,
System.Drawing.FontStyle.Regular,
System.Drawing.GraphicsUnit.Point);
Graphics graphics = Graphics.FromImage(barcode);
SizeF dataSize = graphics.MeasureString(barcodeData, threeOfNine);
dataSize.Height = 70;
barcode = new Bitmap(barcode, dataSize.ToSize());
graphics = Graphics.FromImage(barcode);
graphics.Clear(Color.White);
graphics.TextRenderingHint = TextRenderingHint.SingleBitPerPixel;
graphics.DrawString(barcodeData, threeOfNine, new SolidBrush(Color.Black), 0, 0);
graphics.DrawString(data, arial, new SolidBrush(Color.Black), 50, 40);
graphics.Flush();
threeOfNine.Dispose();
graphics.Dispose();
return barcode;
}
}
我使用上面的代码使用Free 3 of 9生成条形码。但如果我看到大小小于40,我的条形码阅读器就无法读取该代码。尺寸40对我的应用来说太大了,有没有办法减少条形码尺寸?
Font threeOfNine = new Font("Free 3 of 9", 30,
System.Drawing.FontStyle.Regular,
System.Drawing.GraphicsUnit.Point);
答案 0 :(得分:1)
要正确扫描条形码,必须遵循以下两个条件之一:
每个条形码功能的宽度(以设备像素为单位)必须很大
每个条形码功能的宽度(以设备像素为单位)必须是精确整数
如果有人提供基本特征宽度为1/72“的代码39条形码,并尝试在101.6dpi设备上打印,那么应该是1/72”宽的某些功能将打印为一个像素宽并且其他人作为两个像素。应该是2/72“的功能主要打印为三个像素宽,但有时打印为两个。扫描仪看到两个像素宽的扫描仪将无法知道它是否是一个比平常更窄的打印功能,或者是一个比平常更广泛印刷的狭窄特征。
如果条形码尺寸缩小以匹配输出设备的分辨率,那么两个像素宽的东西对扫描仪来说将是一个像素宽的两倍。即使条形码更小,它们也更可能具有可读性。或者,如果输出设备分辨率增加(例如增加到300dpi),则单宽度特征将是4-5像素,而双宽度特征将是8-9像素。即使打印为5像素宽的窄特征后面还有一个打印为8的宽特征(尺寸比略低于“正确”2:1),扫描仪应该没有阅读它。
请注意,虽然某些格式仅使用两个条形和空格宽度,但其他类似Code 128的格式使用更多。可靠的扫描要求能够区分单,双,三和四宽特征。如果单宽度特征在3到4个像素宽之间(因此它们有时显示为3并且有时显示为4),则扫描仪可能难以确定打印为12像素宽的特征是否是打印宽度大于3像素的三宽特征标称或四边形宽度较窄的特征。大多数扫描仪可能都需要进行必要的推断才能弄清楚,但是对于单,双,三和四宽特征具有一致的宽度将大大提高可读性。