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; } } } }