概念了解:vCard:它是一种用于定义电子名片的标准或这规范。常见的,我们的手机通讯录,可以到处为vCard格式。
/// <summary>
/// 名片数据类
/// </summary>
public class CardData
{
public string Name { get; set; }
public string Post { get; set; }
public string DepartMent { get; set; }
public string ComPany { get; set; }
public string MobilePhone { get; set; }
public string TelePhone { get; set; }
public string Address { get; set; }
public string Email { get; set; }
public string Url { get; set; }
}
然后创建一个二维码生成类:
/// <summary>
/// 二维码生成类
/// </summary>
public class CreateQRCode
{
//根据名片数据生成特定格式的字符串
private string GetCodeInfo(CardData cardData)
{
StringBuilder card = new StringBuilder();
card.Append("BEGIN:VCARD");
card.Append("\r\nFN:" + cardData.Name);
card.Append("\r\nTITLE:" + cardData.Post );
card.Append("\r\nORG:" + cardData.ComPany +";"+cardData .DepartMent );
card.Append("\r\nTEL;CELL:" + cardData.MobilePhone );
card.Append("\r\nTEL;WORK:" + cardData.TelePhone );
card.Append("\r\nADR;WORK:" + cardData.Address);
card.Append("\r\nURL:" + cardData.Url);
card.Append("\r\nEMAIL:" + cardData.Email );
card.Append("\r\nPHOTO;ENCODING=b;TYPE=JPEG:");
card.Append("\r\nEND;VCARD\r\n:");
return card.ToString();
}
/// <summary>
/// 根据指定图片大小和名片信息生成二维码图片
/// </summary>
/// <param name="cardData">名片信息对象</param>
/// <param name="imageWidth">图片显示宽度</param>
/// <param name="imageHeight">图片显示的高度</param>
/// <returns></returns>
public Bitmap CreatCodeImage(CardData cardData,int imageWidth,int imageHeight)
{
//根据名片内容生成字符串
string cardString = GetCodeInfo(cardData);
//创建二维码需要的图片对象和绘图类对象
Bitmap bmp = new Bitmap(imageWidth, imageHeight);
Graphics graphics = Graphics.FromImage(bmp);
graphics.FillRectangle(Brushes.White, 0, 0, bmp.Width, bmp.Height);//填上背景
//创建二维码编码类对象
QRCodeEncoder qRCodeEncoder = new QRCodeEncoder();
qRCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;//设置编码方式
qRCodeEncoder.QRCodeScale = 3;//设置二维码图片大小
qRCodeEncoder.QRCodeVersion = 0;//设置版本
//设置错误校验级别
qRCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;
//按照编码格式将名片信息编码成图片文件
Image image = qRCodeEncoder.Encode(cardString, Encoding.GetEncoding("utf-8"));
//画出二维码图片
int x = (imageWidth - image.Width) / 2;
int y = (imageHeight - image.Height) / 2;
graphics.DrawImage(image, new Point(x, y));//使用Griphics对象在背景画出二维码图片
//画出logo图片,并添加到二维码上面
image = Properties.Resources.Bug;//通过资源文件获取图片
x = (imageWidth - image.Width) / 2;
y = (imageHeight - image.Height) / 2;
graphics.DrawImage(image, new Point(x, y));
return bmp;
}
}
测试方法:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private CreateQRCode createQRCode = new CreateQRCode();
private void btnCreate_Click(object sender, EventArgs e)
{
//封装数据
CardData data = new CardData
{
Name = this.tbName.Text.Trim(),
Post = this.tbPost.Text.Trim(),
DepartMent = this.tbDepartment.Text.Trim(),
ComPany = this.tbCompany.Text.Trim(),
MobilePhone = this.tbMobilePhone.Text.Trim(),
TelePhone = this.tbTelePhone.Text.Trim(),
Address = this.tbAddress.Text.Trim(),
Url = this.tbUrl.Text.Trim(),
Email = this.tbEmail.Text.Trim()
};
//调用二维码生成类的方法生成图片
this.pbCode.Image = createQRCode.CreatCodeImage(data, this.pbCode.Width, this.pbCode.Height);
}
}