using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.IO;
using ThoughtWorks.QRCode.Codec;
namespace WX.CRM.Common
{
public class QRCodeHelper
{
public static QRCodeEncoder.ENCODE_MODE qrCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;
///
/// 大小(值越大生成的二维码图片像素越高)
///
//public static int qrCodeScale = 4;
public static int qrCodeScale = 8;
///
/// 版本(注意:设置为0主要是防止编码的字符串太长时发生错误)
///
public static int qrCodeVersion = 0;
///
/// 错误效验、错误更正(有4个等级)
///
public static QRCodeEncoder.ERROR_CORRECTION qrCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;
///
/// 二维码内容编码方式
///
//public static System.Text.Encoding encode = System.Text.Encoding.GetEncoding("GB2312");
public static System.Text.Encoding encode = System.Text.Encoding.UTF8;
public static byte[] Create(string qrCodeBody)
{
QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
qrCodeEncoder.QRCodeEncodeMode = qrCodeEncodeMode;
qrCodeEncoder.QRCodeScale = qrCodeScale;
qrCodeEncoder.QRCodeVersion = qrCodeVersion;
qrCodeEncoder.QRCodeErrorCorrect = qrCodeErrorCorrect;
Image image = qrCodeEncoder.Encode(qrCodeBody, encode);
using (MemoryStream ms = new MemoryStream())
{
image.Save(ms, ImageFormat.Jpeg);
byte[] buffer = new byte[ms.Length];
ms.Seek(0, SeekOrigin.Begin);
ms.Read(buffer, 0, buffer.Length);
return buffer;
}
}
public static Image CreateImg(string qrCodeBody)
{
QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
qrCodeEncoder.QRCodeEncodeMode = qrCodeEncodeMode;
qrCodeEncoder.QRCodeScale = qrCodeScale;
qrCodeEncoder.QRCodeVersion = qrCodeVersion;
qrCodeEncoder.QRCodeErrorCorrect = qrCodeErrorCorrect;
Image image = qrCodeEncoder.Encode(qrCodeBody, encode);
return image;
}
public static byte[] GetQrCode(string name, string price, string productName, string savePath, string url, string payType)
{
var dicPath = Path.Combine(Path.Combine(System.Web.HttpContext.Current.Request.PhysicalApplicationPath, "UploadFile"), "PayQRCode");
var dituPath = Path.Combine(dicPath, "ditu.png");
var wxPath = Path.Combine(dicPath, "wx.png");
var aliPath = Path.Combine(dicPath, "ali.png");
using (Image imgbig = new Bitmap(dituPath))
{
using (Graphics g = Graphics.FromImage(imgbig))
{
var name_font = new Font("微软雅黑", 30, FontStyle.Bold);
g.DrawString(name, name_font, Brushes.Black, 40, 80);
var productName_font = new Font("微软雅黑", 40, FontStyle.Bold);
//var productName_format = new StringFormat{ Alignment = StringAlignment.Center };
SizeF productName_size = g.MeasureString(productName, productName_font);
var productName_x = (imgbig.Width - productName_size.Width) / 2;
//var productName_y = (imgbig.Width - productName_size.Height) / 2;
var productName_y = 165;
g.DrawString(productName, productName_font, Brushes.Orange, productName_x, productName_y);
var price_font = new Font("微软雅黑", 40, FontStyle.Bold);
SizeF price_size = g.MeasureString(price, price_font);
var price_x = (imgbig.Width - price_size.Width) / 2;
//var productName_y = (imgbig.Width - productName_size.Height) / 2;
var price_y = 235;
g.DrawString(price, price_font, Brushes.Black, price_x, price_y);
//二维码
var ssImg = string.Empty;
if (payType == "ali")
{
ssImg = aliPath;
}
else
{
ssImg = wxPath;
}
var img = CombinImage(CreateImg(url), ssImg);
//计算图片大小
float w = imgbig.Width / 4;
float pw = w / (img.Width * (float)0.45);
float ph = w / (img.Height * (float)0.45);
if (pw > ph)
{
pw = ph;
}
int mw = (int)(pw * img.Width);
int mh = (int)(pw * img.Height);
//计算图片在二维上的x,y坐标
int x = (imgbig.Width - mw) / 2;
int y = (imgbig.Height - mh) / 2 + 60;
g.DrawImage(img, x, y, mw, mh);
}
imgbig.Save(savePath);
using (MemoryStream ms = new MemoryStream())
{
imgbig.Save(ms, ImageFormat.Jpeg);
byte[] buffer = new byte[ms.Length];
ms.Seek(0, SeekOrigin.Begin);
ms.Read(buffer, 0, buffer.Length);
return buffer;
}
}
}
///
/// 调用此函数后使此两种图片合并,类似相册,有个
/// 背景图,中间贴自己的目标图片
///
/// 粘贴的源图片
/// 粘贴的目标图片
public static Image CombinImage(Image imgBack, string destImg)
{
Image img = Image.FromFile(destImg); //照片图片
if (img.Height != 65 || img.Width != 65)
{
img = KiResizeImage(img, 65, 65, 0);
}
Graphics g = Graphics.FromImage(imgBack);
g.DrawImage(imgBack, 0, 0, imgBack.Width, imgBack.Height); //g.DrawImage(imgBack, 0, 0, 相框宽, 相框高);
//g.FillRectangle(System.Drawing.Brushes.White, imgBack.Width / 2 - img.Width / 2 - 1, imgBack.Width / 2 - img.Width / 2 - 1,1,1);//相片四周刷一层黑色边框
//g.DrawImage(img, 照片与相框的左边距, 照片与相框的上边距, 照片宽, 照片高);
g.DrawImage(img, imgBack.Width / 2 - img.Width / 2, imgBack.Width / 2 - img.Width / 2, img.Width, img.Height);
GC.Collect();
return imgBack;
}
///
/// Resize图片
///
/// 原始Bitmap
/// 新的宽度
/// 新的高度
/// 保留着,暂时未用
/// 处理以后的图片
public static Image KiResizeImage(Image bmp, int newW, int newH, int Mode)
{
try
{
Image b = new Bitmap(newW, newH);
Graphics g = Graphics.FromImage(b);
// 插值算法的质量
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.DrawImage(bmp, new Rectangle(0, 0, newW, newH), new Rectangle(0, 0, bmp.Width, bmp.Height), GraphicsUnit.Pixel);
g.Dispose();
return b;
}
catch
{
return null;
}
}
}
}