4

JPEG画像がそのバイナリからのみ回転されているかどうか(.NET 4.0、WinFormsを使用しているとしましょう)(の結果のようにFile.ReadAllBytes())わかりますか?

アップデート


これまでにご回答いただきありがとうございました。

同じ問題を解決しようとしている人のための注意事項です。このSystem.Drawing.Imageクラスは、初期化時に EXIF タグをロードしますFromFile(...)が、ストリームから初期化するとそれらを無視するようです。ExifTagCollectionライブラリを使用して EXIF タグを読み取っていましたが、結果は他のライブラリと同等になると思います。

var bytes = (get binary from server)
File.WriteAllBytes(path, bytes);

作品

var image = Image.FromFile(path);

動作しません: (あまりにも失敗しFileStreamます)

using (var ms = new MemoryStream(bytes))
{
    image = Image.FromStream(ms);
}

続き:

ExifTagCollection exif = new ExifTagCollection(image);
foreach (ExifTag tag in exif)
{
    Console.WriteLine(tag.ToString());
}

ストリームからロードする場合、タグはありません。

4

4 に答える 4

5

http://jpegclub.org/exif_orientation.htmlは、exif 方向フラグの詳細を示しています。それを見つけて、向きを見つけてください。

もちろん、これはそのフラグを設定して画像を回転する場合にのみ適用されます。これは、カメラ自体、より詳細な編集用に設計されていない一部の画像表示ソフトウェア、および一部のファイル マネージャー ツールによってよく行われます。 . 誰かが画像をより一般的な画像エディタにロードし、向きを変えて保存した場合、機能しません。

編集:

横向きと縦向きは、「画像デバイスの自然な向きから回転」とは異なります。それも簡単です:

if(img.Height == img.Width)
  return MyAspectEnum.Square;
if(img.Height > img.Width)
  return MyAspectEnum.Portrait;
return MyAspectEnum.Landscape;

それはあなたが本当に知りたいことに近いかもしれません。

于 2012-08-13T10:44:22.273 に答える
2

EXIF データが利用できない場合や信頼できない場合は、画像形式を特定するために次のように想定できます。

  • 高さ > 幅 ? 縦長フォーマット
  • 幅 > 高さ ? 横向きフォーマット
  • 幅=高さ? 写真は完全に正方形、どちらでも構いません

EXIF と同じ制限が適用されます: 画像を反転させ、それに応じて EXIF 情報を更新/設定しなかった物理的な編集は、このチェックも失敗します。

于 2012-08-13T10:51:31.617 に答える
1

JPEG でエンコードされたデータを読み取る方法を知っている場合は、EXIF を探して、EXIF から回転を取得できます。EXIFデータが無いと大変です。

于 2012-08-13T10:31:18.753 に答える
1

JPEG 画像の向きを決定するには、EXIF を読み取る必要があります。

ExifLib - A Fast Exif Data Extractor for .NET 2.0+ をご覧ください。ライブラリはここで指定されたような方向を返すようです。

于 2012-08-13T11:09:01.347 に答える