Python的imghdr
模块确定文件或字节流中包含的图像类型。
.Net Framework中是否存在python的imghdr
模块的等价物?
答案 0 :(得分:0)
就在最近,我需要确定文件中使用的mime类型。我不知道这个Windows API调用背后的确切逻辑,但我怀疑它进入文件内部以了解它的mime类型。希望这会有所帮助
using System;
using System.IO;
using System.Runtime.InteropServices;
namespace SomeNamespace
{
/// <summary>
/// This will work only on windows
/// </summary>
public class MimeTypeFinder
{
[DllImport(@"urlmon.dll", CharSet = CharSet.Auto)]
private extern static UInt32 FindMimeFromData(
UInt32 pBC,
[MarshalAs(UnmanagedType.LPStr)] String pwzUrl,
[MarshalAs(UnmanagedType.LPArray)] byte[] pBuffer,
UInt32 cbSize,
[MarshalAs(UnmanagedType.LPStr)]String pwzMimeProposed,
UInt32 dwMimeFlags,
out UInt32 ppwzMimeOut,
UInt32 dwReserverd
);
public string GetMimeFromFile(string filename)
{
if (!File.Exists(filename))
throw new FileNotFoundException(filename + " not found");
var buffer = new byte[256];
using (var fs = new FileStream(filename, FileMode.Open))
{
if (fs.Length >= 256)
fs.Read(buffer, 0, 256);
else
fs.Read(buffer, 0, (int)fs.Length);
}
try
{
UInt32 mimetype;
FindMimeFromData(0, null, buffer, 256, null, 0, out mimetype, 0);
var mimeTypePtr = new IntPtr(mimetype);
var mime = Marshal.PtrToStringUni(mimeTypePtr);
Marshal.FreeCoTaskMem(mimeTypePtr);
return mime;
}
catch (Exception)
{
return "unknown/unknown";
}
}
}
}
答案 1 :(得分:0)
如果您可以信任该文件的扩展名,则可以执行rails plugin mimetype-fu之类的操作。
这个插件有一个yaml扩展名列表及其已知的mime类型。这是相当详尽的。我们为.net找到了一个yaml解析器,只使用了mimetype-fu的yaml。这使得它既快速构建又快速执行。
如果您只处理流并且没有文件名,则上述内容可能会更适合您。