using System; using System.Collections.Generic; using System.IO; using System.IO.FileFormats; using System.IO.FileFormats.Internals; using System.Linq; namespace System.IO.FileFormats { /// /// 文件格式工具类 /// public static partial class FileFormat { static readonly IReadOnlyDictionary imgFileMagicNums; static FileFormat() { imgFileMagicNums = ImageFormats.ToDictionary(x => x, x => x.GetMagicNumber()); } /// /// 允许使用的图片格式 /// public static ImageFormat[] AllowImageFormats { get; } = { ImageFormat.JPEG, ImageFormat.PNG }; /// /// 允许使用的图片格式的媒体类型 /// public static string[] AllowImageMediaTypeNames { get; } = AllowImageFormats.Select(x => x.GetMIME()).ToArray(); /// /// 支持的图片格式 /// public static ImageFormat[] ImageFormats { get; } = Enum2.GetAll(); /// /// HEIF/HEIC 高效率图像文件格式 /// public static ImageFormat[] HEIF_HEIC_Formats { get; } = { ImageFormat.HEIF, ImageFormat.HEIFSequence, ImageFormat.HEIC, ImageFormat.HEICSequence }; /// /// 检查 二进制数据 是否为图片格式 /// /// /// /// public static bool IsImage(IReadOnlyList buffer, out ImageFormat format) { foreach (var item in ImageFormats) { if (item.IsImage(buffer)) { format = item; return true; } } format = 0; return false; } /// /// 检查 二进制数据 是否为图片格式 /// /// /// public static (bool isImage, ImageFormat format) IsImage(IReadOnlyList buffer) { var isImage = IsImage(buffer, out var format); return (isImage, format); } /// /// 检查 流中的数据 是否为图片格式 /// /// /// /// /// public static bool IsImage(Stream stream, out ImageFormat format) { var length = imgFileMagicNums.Values.Max(MagicNumber.GetLength); var buffer = MagicNumber.ReadHeaderBuffer(stream, length); foreach (var item in imgFileMagicNums) { if (MagicNumber.Match(item.Value, buffer, null)) { format = item.Key; return true; } } format = 0; return false; } /// /// 检查 流中的数据 是否为图片格式 /// /// /// /// public static (bool isImage, ImageFormat format) IsImage(Stream stream) { var isImage = IsImage(stream, out var format); return (isImage, format); } /// /// 检查 二进制数据 是否为 SQLite3 数据库文件 /// /// /// public static bool IsSQLite3(IReadOnlyList buffer) => MagicNumber.SequenceEqual(buffer, DataBaseFileFormat.SQLite3.MagicNumber); /// /// 检查 流中的数据 是否为 SQLite3 数据库文件 /// /// /// public static bool IsSQLite3(Stream stream) => IsSQLite3(MagicNumber.ReadHeaderBuffer(stream, DataBaseFileFormat.SQLite3.MagicNumber.Length)); } } namespace System { partial class ImageFormatEnumExtensions { /// /// 检查图片格式是否允许使用 /// /// /// public static bool IsAllow(this ImageFormat imageFormat) => FileFormat.AllowImageFormats.Contains(imageFormat); /// /// 是否为 HEIF/HEIC 高效率图像文件格式 /// /// /// public static bool IsHEIF_HEIC(this ImageFormat imageFormat) => FileFormat.HEIF_HEIC_Formats.Contains(imageFormat); /// /// 检查 二进制数据 是否为指定的图片格式 /// /// /// /// public static bool IsImage(this ImageFormat imageFormat, IReadOnlyList buffer) { var magicNumber = imageFormat.GetMagicNumber(); return FileFormat.MagicNumber.Match(magicNumber, buffer, null); } /// /// 检查 流中的数据 是否为指定的图片格式 /// /// /// /// public static bool IsImage(this ImageFormat imageFormat, Stream stream) { var magicNumber = imageFormat.GetMagicNumber(); return FileFormat.MagicNumber.Match(magicNumber, null, stream); } } }