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