イメージのファイルフォーマットを拡張子から判断し取得する [C#]

ImageCodecInfoを使用したデモみたいなものです。
下記ではファイルの中身と拡張子が一致しているかを調べています。

.Net Frameworkでサポートされている拡張子

BMP,DIB,RLE,JPG,JPEG,JPE,JFIF,GIF,EMF,WMF,TIF,TIFF,PNG,ICO

フォーマット分類される拡張子
BMPBMP,DIB,RLE
JPEGJPG,JPEG,JPE,JFIF
GIFGIF
EMFEMF
WMFWMF
TIFTIF,TIFF
PNGPNG
ICOICO

「RawFormat.Guid」プロパティによって取得できるファイルフォーマット、つまり中身と拡張子を比較するため、拡張子によって分類されるファイルフォーマットを取得する必要があります。

対象イメージのファイルフォーマットを拡張子から判断し取得します

public static IEnumerable GetFileNameExtensions(ImageCodecInfo ici)
{
    //FilenameExtensionで返される文字列を";"で分割します。
    foreach (string s in ici.FilenameExtension.Split(';'))
    {
        //"."は不要なので省きます
        yield return s.Substring(s.IndexOf('.'));
    }
}


public static string GetImageFormat(string ext)
{
    foreach (ImageCodecInfo ici in ImageCodecInfo.GetImageDecoders())
    {
        foreach (string s in GetFileNameExtensions(ici))
        {
            if (s.ToUpper() == ext.ToUpper())
            {
                //該当するFormatDescriptionを返します。
                return ici.FormatDescription;
            }
        }
    }
    return null;
}

対象イメージのファイルフォーマットをRawFormatから判断し取得します

public static string GetFileFormat(Image img)
{
    try
    {
        foreach (ImageCodecInfo ici in ImageCodecInfo.GetImageDecoders())
        {
            if (ici.FormatID == img.RawFormat.Guid)
                //該当するFormatDescriptionを返します。
                return ici.FormatDescription;
        }
        return string.Empty;
    }
    catch
    {
        return string.Empty;
    }
}

For example

static void Main(string[] args)
{
    string path = @"C:\test.png";

    string fileFormat1 = GetFileFormat(Path.GetExtension(path));
    string fileFormat2 = GetFileFormat(new Bitmap(path));

    Console.WriteLine(
        "fileFormat1 = {0}\nfileFormat2 = {1}\nEquals : {2}",
        fileFormat1, fileFormat2, fileFormat1 == fileFormat2);

    Console.ReadLine();
}

0 Comments:

Recent Posts