这里是俩种分享方式,这次要实现的是图片二维码分享。
其实这个实现的逻辑就是把网址弄成二维码。
/// <summary>
/// 普通二维码
/// </summary>
/// <param name="str">存储内容</param>
/// <param name="pixel">像素大小</param>
/// <returns>返回一个Bitmap对象,表示生成的二维码</returns>
private static Bitmap GetQRCode(string str, int pixel)
{
// 创建一个QRCodeGenerator的实例
QRCodeGenerator generator = new QRCodeGenerator();
// 使用QRCodeGenerator实例生成二维码数据
// 参数分别是:存储内容,错误纠正水平(这里使用M级),是否强制UTF-8编码
QRCodeData codeData = generator.CreateQrCode(str, QRCodeGenerator.ECCLevel.M, true);
// 使用生成的二维码数据创建一个QRCode对象
QRCode qrcode = new QRCode(codeData);
// 使用QRCode对象获取二维码图像
// 参数分别是:像素大小,前景色(二维码颜色),背景色,是否添加边框
Bitmap qrImage = qrcode.GetGraphic(pixel, Color.Black, Color.White, true);
// 返回生成的二维码图像
return qrImage;
}
其中错误纠正级别被设置为 QRCodeGenerator.ECCLevel.Q
。ECCLevel.Q
代表最高级别的错误纠正,可以恢复最多25%的错误。这意味着即使二维码被部分损坏,它仍然可以被正确扫描。这行代码没有提到是否强制使用UTF-8编码,因此默认情况下,它不会强制使用UTF-8编码。强制使用UTF-8编码对包含非ASCII字符的字符串非常重要,因为它确保了二维码在不同的扫描仪和读取器上可以被正确解析。
str就是上图的网址(http://xxx/activity/detail/2_11)
然后我这还有一个需求就是把二维码镶嵌在一个图片里,所以我这边还需要一个两张图片合成一张图片的方法,如不需要可以跳过。
/// <summary>
/// 合并二维码图片
/// </summary>
/// <param name="img1">第一张图片</param>
/// <param name="img2">第二张图片</param>
/// <returns>返回一个Bitmap对象,表示合并后的图片</returns>
public static Bitmap CombinImage(Image img1, Image img2)
{
try
{
// 创建一个新的Bitmap对象,大小与第一张图片相同
Bitmap bmp = new Bitmap(img1.Width, img1.Height);
// 创建Graphics对象,用于绘制图像
Graphics g = Graphics.FromImage(bmp);
// 清除整个绘图面并以白色填充
g.Clear(Color.White);
// 绘制第一张图片
g.DrawImage(img1, 0, 0, img1.Width, img1.Height);
// 绘制第二张图片,指定位置和大小
// 第二张图片被放置在(185, 420)的位置,大小为380x380像素
g.DrawImage(img2, 185, 420, 380, 380);
// 强制执行垃圾回收,释放资源
GC.Collect();
// 返回合并后的图片
return bmp;
}
catch (Exception ex)
{
// 如果发生异常,返回null
return null;
}
}
这个方法接受两个 Image
类型的参数:img1
和 img2
,分别代表要合并的第一张和第二张图片。方法返回一个 Bitmap
对象,这个对象包含了合并后的图片。
方法的工作流程如下:
- 创建一个新的
Bitmap
对象,大小与第一张图片相同。 - 创建一个
Graphics
对象,用于在Bitmap
上绘制。 - 清除
Graphics
对象的绘图面,并用白色填充。 - 使用
DrawImage
方法绘制第一张图片,从图片的左上角开始(x,y坐标是以图片左上角点为0点的),大小不变。 - 使用
DrawImage
方法绘制第二张图片,指定其在Bitmap
上的位置和大小。在这里,第二张图片被放置在坐标 (185, 420) 的位置,并且被缩放到 380x380 像素的大小。 - 调用
GC.Collect()
来强制执行垃圾回收,释放不再使用的资源。 - 返回合并后的
Bitmap
对象。
如果在合并过程中发生任何异常,方法将捕获异常并返回 null
。
至此我还问过一个傻问题:Bitmap和Graphics的区别?
小小解释一下:Bitmap对象代表的是图像数据,可以在内存中加载、操作和保存位图,可以用来获取或设置图像的像素颜色、尺寸等信息等。而Graphics对象提供了绘制图像的方法和功能。
进入正题
/// <summary>
/// 合成二维码
/// </summary>
public static string UniteImage(string str)
{
try
{
var dateNow = DateTime.Now;
string Filepath = "D:\\Darlin\\wwwroot";
//Temp里面的都是存的临时文件,基本生成都是存到临时文件夹中了
string savePath = "/UploadFile/Temp/" + DateTime.Now.ToString("yyyyMMdd")+"活动分享.jpg";
Bitmap QrCodeBitmap = GetQRCode(str, 24);
string QRCodefileName = "Darlin活动分享.png";
string filesavepath = Filepath+ "/UploadFile/Temp/" + QRCodefileName;//这里是生成的二维码图片路径
QrCodeBitmap.Save(filesavepath);
string filesavepath1 = Filepath + "/TemplateFile/活动分享.jpg";//这里是需要和二维码合并的另一张样式图片路径
Image img1 = Image.FromFile(filesavepath1);//从文件系统中的指定路径加载图像
Image img2 = Image.FromFile(filesavepath);
Bitmap bmp = CombinImage(img1, img2);// 合并两张图片
bmp.Save(Filepath + savePath, ImageFormat.Png);
Console.WriteLine("文件保存成功!");
bmp.Clone();
return savePath;
}
catch (Exception ex)
{
return "";
}
}
这是路径 D:\Darlin\wwwroot\TemplateFile 里的样式图:
这是路径 D:\Darlin\wwwroot\UploadFile\Temp 里生成的最终结果图: