112 lines
3.7 KiB
C#
112 lines
3.7 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using System.IO;
|
||
using System.Linq;
|
||
using System.Text;
|
||
using System.Text.RegularExpressions;
|
||
using System.Threading.Tasks;
|
||
|
||
namespace ZR.Common;
|
||
|
||
public static class ImageConverter
|
||
{
|
||
|
||
/// <summary>
|
||
/// 将 Base64 编码的字符串转换为图片的二进制数据(byte[])。
|
||
/// </summary>
|
||
/// <param name="base64String">Base64 编码的字符串,格式可以包含前缀(如 data:image/png;base64,)或不包含</param>
|
||
/// <returns>图片的字节数组</returns>
|
||
public static byte[] Base64ToImageBytes(string base64String)
|
||
{
|
||
// 如果包含 data:image/...base64, 的前缀,去除它
|
||
var base64Data = base64String;
|
||
|
||
if (base64String.Contains(","))
|
||
{
|
||
base64Data = base64String.Substring(base64String.IndexOf(",") + 1);
|
||
}
|
||
|
||
// 将 base64 字符串转换为字节数组
|
||
return Convert.FromBase64String(base64Data);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 将 Base64 转换成图片文件并保存到指定路径
|
||
/// </summary>
|
||
/// <param name="base64String">Base64 字符串</param>
|
||
/// <param name="outputPath">输出文件完整路径(包含文件名和扩展名)</param>
|
||
public static void SaveBase64AsImage(string base64String, string outputPath)
|
||
{
|
||
byte[] imageBytes = Base64ToImageBytes(base64String);
|
||
File.WriteAllBytes(outputPath, imageBytes);
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// 从 Base64 字符串中提取文件扩展名。
|
||
/// </summary>
|
||
/// <param name="base64"></param>
|
||
/// <returns></returns>
|
||
public static string GetFileExtensionFromBase64(string base64)
|
||
{
|
||
// 正则匹配 MIME 类型
|
||
var match = Regex.Match(base64, @"^data:image/(?<format>[a-zA-Z+]+);base64,");
|
||
if (!match.Success) return null;
|
||
|
||
string mimeType = match.Groups["format"].Value.ToLower();
|
||
|
||
// MIME 类型转文件扩展名
|
||
return mimeType switch
|
||
{
|
||
"png" => ".png",
|
||
"jpeg" or "jpg" => ".jpg",
|
||
"gif" => ".gif",
|
||
"webp" => ".webp",
|
||
"bmp" => ".bmp",
|
||
"svg+xml" => ".svg",
|
||
"tiff" => ".tiff",
|
||
"x-icon" => ".ico",
|
||
_ => null // 未知类型
|
||
};
|
||
}
|
||
|
||
/// <summary>
|
||
/// 生成图片名称:时间戳(秒)+4位随机数字
|
||
/// 示例:16907832451234.png
|
||
/// </summary>
|
||
/// <param name="extension">文件扩展名(例如 .png、.jpg),可选,默认值为 .png</param>
|
||
/// <returns>生成的图片文件名</returns>
|
||
public static string GenerateImageFileName(string extension = ".png")
|
||
{
|
||
// 获取当前时间戳(秒)
|
||
long timestamp = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
|
||
|
||
// 生成 4 位随机数(1000 - 9999)
|
||
Random random = new Random();
|
||
int randomNumber = random.Next(1000, 10000);
|
||
|
||
// 拼接文件名
|
||
return $"{timestamp}_{randomNumber}{extension}";
|
||
}
|
||
/// <summary>
|
||
/// 生成图片名称:时间戳(秒)+4位随机数字
|
||
/// 示例:16907832451234.png
|
||
/// </summary>
|
||
/// <param name="extension">文件扩展名(例如 .png、.jpg),可选,默认值为 .png</param>
|
||
/// <returns>生成的图片文件名</returns>
|
||
public static string GenerateImageFileNameTime(string extension = ".png")
|
||
{
|
||
// 获取当前时间戳(秒)
|
||
string now = DateTime.Now.ToString("yyyyMMddHHmmssfff");
|
||
|
||
// 生成 4 位随机数(1000 - 9999)
|
||
Random random = new Random();
|
||
int randomNumber = random.Next(1000, 10000);
|
||
|
||
// 拼接文件名
|
||
return $"{now}_{randomNumber}{extension}";
|
||
}
|
||
}
|
||
|
||
|