次のことを行うコードが必要です。
foreach(File in Directory)
{
test to see if the file is a jpeg
}
しかし、ファイルから読み取る方法に慣れていません。どうすればいいですか?
どのファイルの拡張子が 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
}
}
.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 つの方法のいずれかを実行する必要があります。