EAN商品条码的类
这个使用的比较多
其实 前面的编码是根据前面的6来判断的。是类型A还是类型B
效果
使用方法
-
-
char
_ISBN=MyImage.BandCode.EAN13.EAN13ISBN(
"690102803695"
);
- MessageBox.Show(_ISBN.ToString());
- MyImage.BandCode.EAN13 _EAN13Code =
new
MyImage.BandCode.EAN13();
- _EAN13Code.Magnify = 1;
- _EAN13Code.Heigth = 100;
- _EAN13Code.FontSize = 16;
- pictureBox1.Image=_EAN13Code.GetCodeImage(
"6901028036955"
);
- pictureBox1.Image.Save(@
"C:/1.bmp"
);
具体绘制类
- using
System;
- using
System.Collections;
- using
System.ComponentModel;
- using
System.Drawing;
- using
System.Data;
- namespace
MyImage.BandCode
- {
-
public
class
EAN13
- {
-
private
DataTable m_EAN13 =
new
DataTable();
-
public
EAN13()
- {
- m_EAN13.Columns.Add(
"ID"
);
- m_EAN13.Columns.Add(
"Type"
);
- m_EAN13.Columns.Add(
"A"
);
- m_EAN13.Columns.Add(
"B"
);
- m_EAN13.Columns.Add(
"C"
);
- m_EAN13.Rows.Add(
"0"
,
"AAAAAA"
,
"0001101"
,
"0100111"
,
"1110010"
);
- m_EAN13.Rows.Add(
"1"
,
"AABABB"
,
"0011001"
,
"0110011"
,
"1100110"
);
- m_EAN13.Rows.Add(
"2"
,
"AABBAB"
,
"0010011"
,
"0011011"
,
"1101100"
);
- m_EAN13.Rows.Add(
"3"
,
"AABBBA"
,
"0111101"
,
"0100001"
,
"1000010"
);
- m_EAN13.Rows.Add(
"4"
,
"ABAABB"
,
"0100011"
,
"0011101"
,
"1011100"
);
- m_EAN13.Rows.Add(
"5"
,
"ABBAAB"
,
"0110001"
,
"0111001"
,
"1001110"
);
- m_EAN13.Rows.Add(
"6"
,
"ABBBAA"
,
"0101111"
,
"0000101"
,
"1010000"
);
- m_EAN13.Rows.Add(
"7"
,
"ABABAB"
,
"0111011"
,
"0010001"
,
"1000100"
);
- m_EAN13.Rows.Add(
"8"
,
"ABABBA"
,
"0110111"
,
"0001001"
,
"1001000"
);
- m_EAN13.Rows.Add(
"9"
,
"ABBABA"
,
"0001011"
,
"0010111"
,
"1110100"
);
- }
-
private
uint
m_Height = 40;
-
-
-
-
public
uint
Heigth {
get
{
return
m_Height; }
set
{ m_Height = value; } }
-
private
byte
m_FontSize = 0;
-
-
-
-
public
byte
FontSize {
get
{
return
m_FontSize; }
set
{ m_FontSize = value; } }
-
-
private
byte
m_Magnify = 0;
-
-
-
-
public
byte
Magnify {
get
{
return
m_Magnify; }
set
{ m_Magnify = value; } }
-
public
Bitmap GetCodeImage(
string
p_Text)
- {
-
if
(p_Text.Length != 13)
throw
new
Exception(
"数字不是13位!"
);
-
string
_CodeText = p_Text.Remove(0, 1);
-
string
_CodeIndex =
"101"
;
-
char
[] _LeftType = GetValue(p_Text.Substring(0, 1),
"Type"
).ToCharArray();
-
for
(
int
i = 0; i != 6; i++)
- {
- _CodeIndex += GetValue(_CodeText.Substring(0, 1), _LeftType[i].ToString());
- _CodeText = _CodeText.Remove(0, 1);
- }
-
- _CodeIndex +=
"01010"
;
-
-
for
(
int
i = 0; i != 6; i++)
- {
- _CodeIndex += GetValue(_CodeText.Substring(0, 1),
"C"
);
- _CodeText = _CodeText.Remove(0, 1);
- }
- _CodeIndex +=
"101"
;
-
return
GetImage(_CodeIndex, p_Text);
- }
-
-
-
-
-
-
-
private
string
GetValue(
string
p_Value,
string
p_Type)
- {
-
if
(m_EAN13 ==
null
)
return
""
;
- DataRow[] _Row = m_EAN13.Select(
"ID='"
+ p_Value +
"'"
);
-
if
(_Row.Length != 1)
throw
new
Exception(
"错误的编码"
+ p_Value.ToString());
-
return
_Row[0][p_Type].ToString();
- }
-
-
-
-
-
-
private
Bitmap GetImage(
string
p_Text,
string
p_ViewText)
- {
-
char
[] _Value = p_Text.ToCharArray();
-
int
_FontWidth = 0;
- Font _MyFont =
null
;
-
if
(m_FontSize != 0)
- {
- #region 获取符合大小的字体
- _MyFont =
new
Font(
"宋体"
, m_FontSize);
- Bitmap _MyFontBmp =
new
Bitmap(m_FontSize, m_FontSize);
- Graphics _FontGraphics = Graphics.FromImage(_MyFontBmp);
-
-
for
(
byte
i = m_FontSize; i != 0; i--)
- {
- SizeF _DrawSize = _FontGraphics.MeasureString(p_ViewText.Substring(0, 1), _MyFont);
-
if
(_DrawSize.Height > m_FontSize)
- {
- _MyFont =
new
Font(
"宋体"
, i);
- }
-
else
- {
- _FontWidth = (
int
)_DrawSize.Width;
-
break
;
- }
- }
- #endregion
- }
-
if
(ScanDrawText(_MyFont, p_Text, _FontWidth) ==
false
)
- {
- _FontWidth = 0;
- m_FontSize = 0;
- }
-
- Bitmap _CodeImage =
new
Bitmap(_Value.Length * ((
int
)m_Magnify + 1) + (_FontWidth * 2), (
int
)m_Height);
- Graphics _Garphics = Graphics.FromImage(_CodeImage);
- _Garphics.FillRectangle(Brushes.White,
new
Rectangle(0, 0, _CodeImage.Width, _CodeImage.Height));
-
-
int
_Height = 0;
-
int
_LenEx = _FontWidth;
-
for
(
int
i = 0; i != _Value.Length; i++)
- {
-
int
_DrawWidth = m_Magnify + 1;
-
if
(i == 0 || i == 2 || i==46 || i==48 || i==92 || i==94)
- {
- _Height = (
int
)m_Height;
- }
-
else
- {
- _Height = (
int
)m_Height - m_FontSize;
- }
-
if
(_Value[i] ==
'1'
)
- {
- _Garphics.FillRectangle(Brushes.Black,
new
Rectangle(_LenEx, 0, _DrawWidth, _Height));
-
- }
-
else
- {
- _Garphics.FillRectangle(Brushes.White,
new
Rectangle(_LenEx, 0, _DrawWidth, _Height));
- }
- _LenEx += _DrawWidth;
- }
-
-
if
(_FontWidth != 0 && m_FontSize != 0)
- {
-
int
_StarX = 0;
-
int
_StarY=(
int
)m_Height - _MyFont.Height;
- _Garphics.DrawString(p_ViewText.Substring(0, 1), _MyFont, Brushes.Black, 0, _StarY);
- _StarX = _FontWidth + (3 * (m_Magnify + 1));
- _Garphics.DrawString(p_ViewText.Substring(1, 6), _MyFont, Brushes.Black, _StarX, _StarY);
- _StarX = _FontWidth + (50 * (m_Magnify + 1));
- _Garphics.DrawString(p_ViewText.Substring(7, 6), _MyFont, Brushes.Black, _StarX, _StarY);
- }
- _Garphics.Dispose();
-
return
_CodeImage;
- }
-
-
-
-
-
-
-
-
private
bool
ScanDrawText(Font _MyFont,
string
p_Text,
int
p_Width)
- {
-
if
(_MyFont==
null
)
return
false
;
-
int
_Width = (p_Text.Length - 6 - 5) * ((
int
)m_Magnify + 1);
-
if
((p_Width*12) > _Width)
return
false
;
-
return
true
;
- }
-
-
-
-
-
-
public
static
char
EAN13ISBN(
string
_Numb)
- {
-
int
_Sum = 0;
-
int
_i = 1;
-
foreach
(
char
_Char
in
_Numb)
- {
-
if
(
"0123456789"
.IndexOf(_Char) < 0)
continue
;
- _Sum += (_Char -
'0'
) * _i;
- _i = _i == 1 ? 3 : 1;
- }
-
return
"01234567890"
[10 - _Sum % 10];
- }
-
- }
- }
剩下CODE39了 这个过几天再做把。