36

C#を使用して、ファイルがjpegであることをテストするにはどうすればよいですか?.jpg拡張子を確認する必要がありますか?

ありがとう

4

16 に答える 16

108

いくつかのオプション:

ファイル拡張子を確認できます。

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;
    }
}
于 2009-04-21T13:06:25.060 に答える
28

ファイルをストリームとして開き、 JPEGのマジック ナンバーを探します。

JPEG 画像ファイルは、FF D8 で始まり、FF D9 で終わります。JPEG/JFIF ファイルには、「JFIF」の ASCII コード (4A 46 49 46) がヌル終了文字列として含まれています。JPEG/Exif ファイルには、「Exif」の ASCII コード (45 78 69 66) もヌル終了文字列として含まれています。

于 2009-04-21T12:51:35.783 に答える
27

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;
        }
    }
于 2012-01-06T08:08:17.980 に答える
13

ファイルを画像にロードしてから、形式を確認できます

Image img = Image.FromFile(filePath);
bool isBitmap = img.RawFormat.Equals(ImageFormat.Jpeg);

または、ファイルを開いてヘッダーをチェックしてタイプを取得することもできます

于 2009-04-21T12:51:50.277 に答える
4

jpeg ファイル形式、特にヘッダー情報に関するドキュメントを見つけることができます。次に、ファイルからこの情報を読み取り、予想される jpeg ヘッダー バイトと比較してみてください。

于 2009-04-21T12:49:00.000 に答える
3

ヘッダー バイトを読み取ります。この記事には、JPEG を含むいくつかの一般的な画像形式に関する情報が含まれています。

画像ファイル ヘッダーを使用して画像形式を確認する

JPEG ヘッダー情報

于 2009-04-21T12:53:12.627 に答える
1

拡張子を取得したら、正規表現を使用して検証できます。

^.*\.(jpg|JPG)$
于 2009-04-21T12:50:35.787 に答える
1

これは、現在のディレクトリ内の各ファイルをループし、見つかった 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");
                }
            }
        }
于 2009-04-21T12:58:26.907 に答える
1

このファイルを表示しているコンテキストによっては、ユーザーがファイルを開くように指示するまで、ファイルを開くことができないことに注意する必要があります。

(リンクは Raymond Chen のブログ エントリです。)

于 2009-04-21T13:03:36.673 に答える
0

ファイルのメディア タイプを取得して確認するだけです。

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");
        }
于 2014-08-19T15:09:40.400 に答える
0
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
于 2016-11-09T13:25:37.003 に答える
0

ここのコード:

http://mark.michaelis.net/Blog/RetrifyingMetaDataFromJPEGFilesUsingC.aspx

メタデータを取得する方法を示します。画像が有効な JPEG でない場合、例外がスローされると思います。

于 2009-04-21T12:50:17.720 に答える
0

ファイル名が嘘をついている可能性があるため、ファイル拡張子を確認するだけでは不十分です。

手っ取り早く汚い方法は、Image クラスを使用してイメージをロードし、例外をキャッチすることです。

Image image = Image.FromFile(@"c:\temp\test.jpg");

OutOfMemoryException、FileNotFoundException など、あらゆる種類の例外が発生する可能性があるため、これは理想的ではありません。

最も徹底的な方法は、ファイルをバイナリとして扱い、ヘッダーが JPG 形式と一致するようにすることです。きっとどこかに記載されていると思います。

于 2009-04-21T12:54:55.947 に答える
0

Drawing.Bitmap (文字列) コンストラクターを使用してイメージを作成し、それが失敗するか、例外がスローされるかを確認するのが最善の方法です。いくつかの回答の問題点は次のとおりです。まず、拡張子は純粋に任意であり、jpg、jpeg、jpe、bob、tim など、何でもかまいません。第二に、ヘッダーを使用するだけでは 100% 確実ではありません。ファイルが jpeg ではないことは確実に判断できますが、ファイルが jpeg であることを保証することはできません。任意のバイナリ ファイルの最初のバイト シーケンスが同じである可能性があります。

于 2009-04-21T12:55:10.237 に答える
-1

Path.GetExtension Methodを使用できます。

于 2009-04-21T12:48:20.423 に答える