C#使用Graphics合成二维码和头像的分享图(小程序分享、App分享)-C/S开发框架

适用于微信小程序分享图、app分享图
string path = Server.MapPath("/Content/images/backimg.jpg");
Image imgSrc = Image.FromFile(path);
var qr_url="http://xxxxxx:8001/Images/qrimg.jpg";
Image qrCodeImage= ReduceImage(qr_url, 122, 122);
var headurl="http://xxxxxx:8001/Images/header.jpg";
Image headImage= ReduceImage(headurl, 59, 59);
using (Graphics g = Graphics.FromImage(imgSrc))
{
int qr_x = 30,qr_y = 40;
Rectangle destRect = new Rectangle(qr_x, qr_y, qrCodeImage.Width, qrCodeImage.Height);
Rectangle srcRect = new Rectangle(0, 0, qrCodeImage.Width, qrCodeImage.Height);
g.DrawImage(qrCodeImage, destRect, srcRect, GraphicsUnit.Pixel);
Image header = CutEllipse(titleImage, new Size(59, 59));
int w = header.Width, h = header.Height;
int x = 24, y = 982;
g.DrawImage(header,
new Rectangle(x, y, w, h),
new Rectangle(0, 0, w, h),
GraphicsUnit.Pixel);
Font font = new Font("Source Han Sans CN Regular", 18, FontStyle.Bold, GraphicsUnit.Pixel);
Color fontColor = (Color)new ColorConverter().ConvertFromString("#999999");
g.DrawString("张三", font, new SolidBrush(fontColor), 100, 990);
var othertext = "邀请您看直播";
g.DrawString(othertext, font, new SolidBrush(fontColor), 101, 1014);
header.Dispose();
g.Dispose();
}
long quality = 80L;
ImageCodecInfo[] icis = ImageCodecInfo.GetImageEncoders();
ImageCodecInfo ici = GetEncoder(ImageFormat.Jpeg);
EncoderParameters ep = new EncoderParameters(1);
ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
MemoryStream ms = new MemoryStream();
imgSrc.Save(ms, ici, ep);
var buffer = ms.GetBuffer();
ms.Dispose();
imgSrc.Dispose();
qrCodeImage.Dispose();
headImage.Dispose();
ep.Dispose();
GetEncoder 方法用于返回图片的格式,这里设置的为jpeg格式
private static ImageCodecInfo GetEncoder(ImageFormat format)
{
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();
foreach (ImageCodecInfo codec in codecs)
{
if (codec.FormatID == format.Guid)
{
return codec;
}
}
return null;
}
ReduceImage 方法可以缩放图片大小
private static Image ReduceImage(string url, int toWidth, int toHeight, string param = null)
{
try
{
Stream responseStream = null;
if (param != null)
{
var intResult = HttpHelper.HttpClientPost(url, param, out responseStream);
}
else
{
WebRequest request = WebRequest.Create(url);
WebResponse response = request.GetResponse();
responseStream = response.GetResponseStream();
}
if (responseStream == null)
{
return null;
}
Image originalImage = Image.FromStream(responseStream);
if (toWidth <= 0 && toHeight <= 0)
{
return originalImage;
}
else if (toWidth > 0 && toHeight > 0)
{
if (originalImage.Width < toWidth && originalImage.Height < toHeight)
return originalImage;
}
else if (toWidth <= 0 && toHeight > 0)
{
if (originalImage.Height < toHeight)
return originalImage;
toWidth = originalImage.Width * toHeight / originalImage.Height;
}
else if (toHeight <= 0 && toWidth > 0)
{
if (originalImage.Width < toWidth)
return originalImage;
toHeight = originalImage.Height * toWidth / originalImage.Width;
}
Image toBitmap = new Bitmap(toWidth, toHeight);
using (Graphics g = Graphics.FromImage(toBitmap))
{
g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighSpeed;
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
g.Clear(Color.Transparent);
g.DrawImage(originalImage,
new Rectangle(0, 0, toWidth, toHeight),
new Rectangle(0, 0, originalImage.Width, originalImage.Height),
GraphicsUnit.Pixel);
originalImage.Dispose();
responseStream.Dispose();
g.Dispose();
return toBitmap;
}
}
catch (Exception ex)
{
throw;
}
}
CutEllipse方法用来裁剪头像
private static Image CutEllipse(Image img, Size size)
{
try
{
var rec = new Rectangle(0, 0, size.Width, size.Height);
Bitmap bitmap = new Bitmap(size.Width, size.Height);
Pen p = new Pen(Color.Transparent);
using (Graphics g = Graphics.FromImage(bitmap))
{
using (TextureBrush br = new TextureBrush(img, rec))
{
g.SmoothingMode = SmoothingMode.HighQuality;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.CompositingQuality = CompositingQuality.HighQuality;
g.FillEllipse(br, rec);
g.DrawEllipse(p, rec);
br.Dispose();
}
g.Dispose();
}
return bitmap;
}
catch (Exception ex)
{
throw;
}
}
接下来开始测试:
后端返回图片方式1: 服务端以 Response.BinaryWrite(buffer) 格式输出到前端
[HttpPost]
public ActionResult DrawImages()
{
try
{
string pathparam = "123";
byte[] buffer = null;
DrawShareImage(pathparam, out buffer);
Response.ClearContent();
Response.ContentType = "image/jpeg";
Response.BinaryWrite(buffer);
}
catch (Exception)
{
throw;
}
return View();
}
前端接收方式:原本想使用Ajax的方式请求,结果发现数据格式不支持,遂改用以下方式接收
var xhr = new XMLHttpRequest();
xhr.open('POST', apihost + '/Test/DrawImages', true);
xhr.responseType = 'blob';
xhr.setRequestHeader("client_type", "DESKTOP_WEB");
xhr.onload = function () {
if (this.status === 200) {
var blob = this.response;
var imageUrl = window.URL.createObjectURL(blob);;
$("#showimg").attr('src', imageUrl);
}
}
xhr.send();
var xhr = new XMLHttpRequest();
xhr.open('POST', apihost + '/Test/DrawImages', true);
xhr.responseType = 'arraybuffer';
xhr.setRequestHeader("client_type", "DESKTOP_WEB");
xhr.onload = function () {
if (this.status === 200) {
var blob = this.response;
let bytes = new Uint8Array(blob);
let data = "";
let len = bytes.byteLength;
for (let i = 0; i < len; i++) {
data += String.fromCharCode(bytes[i]);
}
var imageUrl = "data:image/jpeg;base64," + window.btoa(data);
$("#showimg").attr('src', imageUrl);
}
}
xhr.send();
后端返回图片方式2: 服务端以 FileContentResult(buffer) 格式输出到前端,前端请求方式同上
[HttpPost]
public FileResult DrawImages()
{
try
{
string pathparam = "123";
byte[] buffer = null;
DrawShareImage(pathparam, out buffer);
return new FileContentResult(buffer, "image/jpeg");
}
catch (Exception)
{
throw;
}
}
后端返回图片方式3: 服务端以 Base64字符串格式输出到前端,前端可以使用Ajax方式请求
[HttpPost]
public string DrawImages()
{
try
{
string pathparam = "123";
byte[] buffer = null;
DrawShareImage(pathparam, out buffer);
return Convert.ToBase64String(buffer);
}
catch (Exception ex)
{
throw;
}
}
前端请求Base64格式图片
var xhr = new XMLHttpRequest();
xhr.open('POST', apihost + '/Test/DrawImages', true);
xhr.responseType = 'text';
xhr.setRequestHeader("client_type", "DESKTOP_WEB");
xhr.onload = function () {
if (this.status === 200) {
var content = this.response;
var imageUrl = "data:image/jepg;base64," + content;
$("#showimg").attr('src', imageUrl);
}
}
xhr.send();
$.ajax({
type: "POST",
dataType: "text",
url: apihost + "/Test/DrawImages",
data: {},
success: function (result) {
var imageUrl = "data:image/jepg;base64," + result;
$("#showimg").attr('src', imageUrl);
},
error: function (s) {
alert("异常!");
}
});
效果图:


CSCODE.NETC/S开发框架-C/S框架网专注.NET技术、C/S架构快速开发框架软件