110,534
社区成员
发帖
与我相关
我的任务
分享
using System.Text;
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
public class FontConvertBmp
{
private string m_FontName;
//字体名字
private int m_FontSize;
//字体大小
private string m_String;
//需要打印的文本
private bool m_FontBold;
//字体样式
private int m_X;
private int m_Y;
//打印时候的X,Y坐标
private int m_XZoom;
private int m_YZoom;
//打印时候的X,Y方向的放大倍数最大只能为10倍
private List<char> List1;
private List<int> List2;
//压缩代码集合
private string S;
[DllImport("gdi32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
private static extern int DeleteDC(IntPtr hdc);
[DllImport("gdi32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
private static extern IntPtr CreateCompatibleDC(IntPtr hdc);
public int XZoom {
get { return m_XZoom; }
set {
if (value > 0 && value <= 10) {
m_XZoom = value;
}
}
}
public int YZoom {
get { return m_YZoom; }
set {
if (value > 0 && value <= 10) {
m_YZoom = value;
}
}
}
public int X {
get { return m_X; }
set {
if (value >= 0) {
m_X = value;
}
}
}
public int Y {
get { return m_Y; }
set {
if (value >= 0) {
m_Y = value;
}
}
}
public string FontName {
get { return m_FontName; }
set { m_FontName = value; }
}
public int FontSize {
get { return m_FontSize; }
set {
if (value > 7 && value <= 500) {
m_FontSize = value;
}
}
}
public string Text {
get { return m_String; }
set { m_String = value; }
}
public bool FontBold {
get { return m_FontBold; }
set { m_FontBold = value; }
}
public FontConvertBmp()
{
m_FontName = "宋体";
m_FontSize = 12;
m_FontBold = false;
m_X = 1;
m_Y = 1;
m_XZoom = 1;
m_YZoom = 1;
InitDictionary();
}
public string Convert()
{
IntPtr Hdc = default(IntPtr);
Hdc = CreateCompatibleDC(IntPtr.Zero);
Graphics Graphic = Graphics.FromHdc(Hdc);
int Width = 0;
int Height = 0;
Graphics G = default(Graphics);
Bitmap Image = default(Bitmap);
Font Font = default(Font);
if (m_FontBold == true) {
Font = new Font(m_FontName, m_FontSize, Drawing.FontStyle.Bold, GraphicsUnit.Pixel);
}
else {
Font = new Font(m_FontName, m_FontSize, Drawing.FontStyle.Regular, GraphicsUnit.Pixel);
}
Width = ((int)Graphic.MeasureString(m_String, Font).Width / 8 + 1) * 8;
//将行规格话便于计算字节
Height = Font.Height;
//列高
Image = new Bitmap(Width, Height, PixelFormat.Format32bppArgb);
G = Graphics.FromImage(Image);
G.Clear(Color.White);
G.DrawString(m_String, Font, Brushes.Black, 0, 2);
//将文本写入图片
int Value = Width * Height;
StringBuilder TempString = new StringBuilder(Value);
StringBuilder DesString = new StringBuilder(Value);
DesString.Append("~DGOUTSTR01," + Width * Height / 8 + "," + Width / 8 + ",");
int i = 0;
int j = 0;
int Sum = 0;
for (j = 0; j <= Height - 1; j++) {
//由于内存中的图片是倒置,所以要反取数据
for (i = 0; i <= Width / 4 - 1; i++) {
Sum = 0;
for (int m = 0; m <= 3; m++) {
//由于4个点可用1个十六进制数表示因此一次取4个点进行转换
if (Image.GetPixel(i * 4 + m, j).B == 0) {
//由于只打印黑白点所以根据RGB分量判断是否需要打印该点
//通过移位操作将该点的信息与一个BIT相对应
Sum += 1 < (3 - m);
}
}
//将取出的点转换成16进制数
TempString.Append(Conversion.Hex(Sum));
}
}
int Count = 1;
//将转成16进制的文本进行压缩
for (i = 1; i <= TempString.Length - 1; i++) {
if (TempString.Chars(i - 1) == TempString.Chars(i)) {
Count += 1;
if (i == TempString.Length - 1) {
DesString.Append(CompressCode(Count) + TempString.Chars(i));
}
}
else {
DesString.Append(CompressCode(Count) + TempString.Chars(i - 1));
S = string.Empty;
Count = 1;
}
}
DesString.Append(Constants.vbCrLf + "^FO" + m_X.ToString + "," + m_Y.ToString + "^XGOUTSTR01," + m_XZoom + "," + m_YZoom + ",^FS");
DeleteDC(Hdc);
G.Dispose();
Image.Dispose();
Graphic.Dispose();
return DesString.ToString;
}
private string CompressCode(ref int Input)
{
if (Input > 1) {
for (int i = List1.Count - 1; i >= 0; i += -1) {
//使用递归和贪婪算法将连续的数字转换成ZPL压缩代码,如000可用I0表示
if (Input >= List2.Item(i)) {
S += List1.Item(i);
Input -= List2.Item(i);
CompressCode(Input);
}
}
}
return S;
}
private void InitDictionary()
{
//将ZPL定义的压缩代码写入集合
List1 = new List<char>();
List2 = new List<int>();
for (int i = 0; i <= 18; i++) {
List1.Add(Strings.ChrW(71 + i));
List2.Add(i + 1);
}
for (int i = 0; i <= 19; i++) {
List1.Add(Strings.ChrW(103 + i));
List2.Add(20 * (i + 1));
}
}
}
http://www.developerfusion.com/tools/convert/vb-to-csharp/