C#を使用して、ファイルがjpegであることをテストするにはどうすればよいですか?.jpg拡張子を確認する必要がありますか?
ありがとう
いくつかのオプション:
ファイル拡張子を確認できます。
static bool HasJpegExtension(string filename)
{
// add other possible extensions here
return Path.GetExtension(filename).Equals(".jpg", StringComparison.InvariantCultureIgnoreCase)
|| Path.GetExtension(filename).Equals(".jpeg", StringComparison.InvariantCultureIgnoreCase);
}
または、ファイルのヘッダーで正しいマジック ナンバーを確認します。
static bool HasJpegHeader(string filename)
{
using (BinaryReader br = new BinaryReader(File.Open(filename, FileMode.Open, FileAccess.Read)))
{
UInt16 soi = br.ReadUInt16(); // Start of Image (SOI) marker (FFD8)
UInt16 marker = br.ReadUInt16(); // JFIF marker (FFE0) or EXIF marker(FFE1)
return soi == 0xd8ff && (marker & 0xe0ff) == 0xe0ff;
}
}
別のオプションは、イメージをロードして正しいタイプを確認することです。ただし、これは効率的ではありませんが (とにかくイメージをロードする場合を除きます)、おそらく最も信頼性の高い結果が得られます (ロードと圧縮解除の追加コスト、および例外処理の可能性に注意してください)。
static bool IsJpegImage(string filename)
{
try
{
using (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のマジック ナンバーを探します。
JPEG 画像ファイルは、FF D8 で始まり、FF D9 で終わります。JPEG/JFIF ファイルには、「JFIF」の ASCII コード (4A 46 49 46) がヌル終了文字列として含まれています。JPEG/Exif ファイルには、「Exif」の ASCII コード (45 78 69 66) もヌル終了文字列として含まれています。
OMG、これらのコード例の多くは間違っています。
EXIF ファイルには 0xff* e1 * のマーカーがあり、JFIF ファイルには 0xff* e0 * のマーカーがあります。したがって、JPEG ファイルを検出するために 0xffe0 に依存するすべてのコードは、すべての EXIF ファイルを見逃すことになります。
両方を検出し、JFIF のみまたは EXIF のみを返すように簡単に変更できるバージョンを次に示します。(たとえば、iPhone の写真を復元しようとするときに便利です)。
public static bool HasJpegHeader(string filename)
{
try
{
// 0000000: ffd8 ffe0 0010 4a46 4946 0001 0101 0048 ......JFIF.....H
// 0000000: ffd8 ffe1 14f8 4578 6966 0000 4d4d 002a ......Exif..MM.*
using (BinaryReader br = new BinaryReader(File.Open(filename, FileMode.Open, FileAccess.ReadWrite)))
{
UInt16 soi = br.ReadUInt16(); // Start of Image (SOI) marker (FFD8)
UInt16 marker = br.ReadUInt16(); // JFIF marker (FFE0) EXIF marker (FFE1)
UInt16 markerSize = br.ReadUInt16(); // size of marker data (incl. marker)
UInt32 four = br.ReadUInt32(); // JFIF 0x4649464a or Exif 0x66697845
Boolean isJpeg = soi == 0xd8ff && (marker & 0xe0ff) == 0xe0ff;
Boolean isExif = isJpeg && four == 0x66697845;
Boolean isJfif = isJpeg && four == 0x4649464a;
if (isJpeg)
{
if (isExif)
Console.WriteLine("EXIF: {0}", filename);
else if (isJfif)
Console.WriteLine("JFIF: {0}", filename);
else
Console.WriteLine("JPEG: {0}", filename);
}
return isJpeg;
return isJfif;
return isExif;
}
}
catch
{
return false;
}
}
ファイルを画像にロードしてから、形式を確認できます
Image img = Image.FromFile(filePath);
bool isBitmap = img.RawFormat.Equals(ImageFormat.Jpeg);
または、ファイルを開いてヘッダーをチェックしてタイプを取得することもできます
jpeg ファイル形式、特にヘッダー情報に関するドキュメントを見つけることができます。次に、ファイルからこの情報を読み取り、予想される jpeg ヘッダー バイトと比較してみてください。
拡張子を取得したら、正規表現を使用して検証できます。
^.*\.(jpg|JPG)$
これは、現在のディレクトリ内の各ファイルをループし、見つかった JPG または JPEG 拡張子のファイルが JPEG 画像である場合に出力します。
foreach (FileInfo f in new DirectoryInfo(".").GetFiles())
{
if (f.Extension.ToUpperInvariant() == ".JPG"
|| f.Extension.ToUpperInvariant() == ".JPEG")
{
Image image = Image.FromFile(f.FullName);
if (image.RawFormat == ImageFormat.Jpeg)
{
Console.WriteLine(f.FullName + " is a Jpeg image");
}
}
}
このファイルを表示しているコンテキストによっては、ユーザーがファイルを開くように指示するまで、ファイルを開くことができないことに注意する必要があります。
(リンクは Raymond Chen のブログ エントリです。)
ファイルのメディア タイプを取得して確認するだけです。
private bool isJpeg()
{
string p = currFile.Headers.ContentType.MediaType;
return p.ToLower().Equals("image/jpeg") || p.ToLower().Equals("image/pjpeg") || p.ToLower().Equals("image/png");
}
System.Web.MimeMapping.GetMimeMapping(filename).StartsWith("image/");
MimeMapping.GetMimeMapping produces these results:
file.jpg: image/jpeg
file.gif: image/gif
file.jpeg: image/jpeg
file.png: image/png
file.bmp: image/bmp
file.tiff: image/tiff
file.svg: application/octet-stream
ここのコード:
http://mark.michaelis.net/Blog/RetrifyingMetaDataFromJPEGFilesUsingC.aspx
メタデータを取得する方法を示します。画像が有効な JPEG でない場合、例外がスローされると思います。
ファイル名が嘘をついている可能性があるため、ファイル拡張子を確認するだけでは不十分です。
手っ取り早く汚い方法は、Image クラスを使用してイメージをロードし、例外をキャッチすることです。
Image image = Image.FromFile(@"c:\temp\test.jpg");
OutOfMemoryException、FileNotFoundException など、あらゆる種類の例外が発生する可能性があるため、これは理想的ではありません。
最も徹底的な方法は、ファイルをバイナリとして扱い、ヘッダーが JPG 形式と一致するようにすることです。きっとどこかに記載されていると思います。
Drawing.Bitmap (文字列) コンストラクターを使用してイメージを作成し、それが失敗するか、例外がスローされるかを確認するのが最善の方法です。いくつかの回答の問題点は次のとおりです。まず、拡張子は純粋に任意であり、jpg、jpeg、jpe、bob、tim など、何でもかまいません。第二に、ヘッダーを使用するだけでは 100% 確実ではありません。ファイルが jpeg ではないことは確実に判断できますが、ファイルが jpeg であることを保証することはできません。任意のバイナリ ファイルの最初のバイト シーケンスが同じである可能性があります。
Path.GetExtension Methodを使用できます。