1

次のことを行うコードが必要です。

foreach(File in Directory)
{
  test to see if the file is a jpeg
}

しかし、ファイルから読み取る方法に慣れていません。どうすればいいですか?

4

3 に答える 3

1

どのファイルの拡張子が jpeg であるかだけを知りたい場合は、次のようにします。

HashSet<string> JpegExtensions = 
    new HashSet<string>(StringComparer.InvariantCultureIgnoreCase)
        { ".jpg", ".jpe", ".jpeg", ".jfi", ".jfif" }; // add others as necessary

foreach(var fname in Directory.EnumerateFiles(pathname))
{
    if (JpegExtensions.Contains(Path.GetExtension(fname))
    {
        Console.WriteLine(fname); // do something with the file
    }
}
于 2013-06-29T03:50:25.770 に答える
1

.NET 4 Directory.EnumerateFilesをターゲットにしている場合は、特に大きなディレクトリの場合、より効率的である可能性があります。EnumerateFilesそうでない場合は、以下に置き換えることができGetFilesます。

//add all the extensions you want to filter to this array
string[] ext = { "*.jpg", "*.jpeg", "*.jiff"  };
var fPaths = ext.SelectMany(e => Directory.EnumerateFiles(myDir, e, SearchOption.AllDirectories)).ToList();

正しい拡張子を持つファイルのリストを取得したら、この回答.jpgに記載されている 2 つの異なる方法のいずれかを使用して、ファイルが実際に JPEG であるかどうかを確認できます (名前が変更されただけではありません) 。(その投稿より)

static bool HasJpegHeader(string filename)
{
    using (BinaryReader br = new BinaryReader(File.Open(filename, FileMode.Open)))
    {
        UInt16 soi = br.ReadUInt16();  // Start of Image (SOI) marker (FFD8)
        UInt16 jfif = br.ReadUInt16(); // JFIF marker (FFE0)

        return soi == 0xd8ff && jfif == 0xe0ff;
    }
}

または、より正確ですが、より遅い方法

static bool IsJpegImage(string filename)
{
    try
    {
        System.Drawing.Image img = System.Drawing.Image.FromFile(filename);

        // Two image formats can be compared using the Equals method
        // See http://msdn.microsoft.com/en-us/library/system.drawing.imaging.imageformat.aspx
        //
        return img.RawFormat.Equals(System.Drawing.Imaging.ImageFormat.Jpeg);
    }
    catch (OutOfMemoryException)
    {
        // Image.FromFile throws an OutOfMemoryException 
        // if the file does not have a valid image format or
        // GDI+ does not support the pixel format of the file.
        //
        return false;
    }
}

拡張子が正しくない JPEG ファイルがある可能性がある場合は、ディレクトリ内のすべてのファイルをループして (*.*フィルターとして使用)、上記の 2 つの方法のいずれかを実行する必要があります。

于 2013-06-28T22:45:00.100 に答える