ExifのOrientationタグ、JEIDAの規格書によると、


1 = 0 番目の行が目で見たときの画像の上(visual top)、0 番目の列が左側(visual left-hand side)とな
る。
2 = 0 番目の行が目で見たときの画像の上、0 番目の列が右側(visual right-hand side)となる。
3 = 0 番目の行が目で見たときの画像の下(visual bottom)、0 番目の列が右側となる。
4 = 0 番目の行が目で見たときの画像の下、0 番目の列が左側となる。
5 = 0 番目の行が目で見たときの画像の左側、0 番目の列が上となる。
6 = 0 番目の行が目で見たときの画像の右側、0 番目の列が上となる。
7 = 0 番目の行が目で見たときの画像の右側、0 番目の列が下となる。
8 = 0 番目の行が目で見たときの画像の左側、0 番目の列が下となる。

と記載されてはいるが、オレのオツムでは正しい補正方法がこの文章では、どうにもよく理解できない・・・
いろいろ参考になるものを探したら、perlのExif.pmというライブラリのソースが見つかり、次のように定義されていた。、

%orientation = (
1 => 'Horizontal (normal)',
2 => 'Mirror horizontal',
3 => 'Rotate 180',
4 => 'Mirror vertical',
5 => 'Mirror horizontal and rotate 270 CW',
6 => 'Rotate 90 CW',
7 => 'Mirror horizontal and rotate 90 CW',
8 => 'Rotate 270 CW',
);

何とわかりやすい表現だこと!これでどう扱えばよいかやっと理解できた。

ざっくりとGDI+で表現するとこんな感じかな。

Image img(L"画像ファイル名");

//オリエンテーションタグの値を取得
//自分で実装してね。


switch(オリエンテーションタグの値)
{
case 1:
break;
case 2:
img.RotateFlip(RotateNoneFlipY);
break;
case 3:
img.RotateFlip(Rotate180FlipNone);
break;
case 4:
img.RotateFlip(RotateNoneFlipX);
break;
case 5:
img.RotateFlip(Rotate270FlipY);
break;
case 6:
img.RotateFlip(Rotate90FlipNone);
break;
case 7:
img.RotateFlip(Rotate90FlipX);
break;
case 8:
img.RotateFlip(Rotate270FlipNone);
break;
default:
break;
}