如果圖片包含exif data的PropertyItems
應包括方向標籤。
它編碼旋轉/翻轉要正確顯示圖像:
PropertyTagOrientation以行和列的條件觀察
圖像方向。
標籤0x0112
1 - 第0行是在 可視圖像的頂部,和第0列是視覺左側。
2 - 第0行 行位於圖像的視覺上方,第0列位於右側視覺方位 。
3 - 第0行在 圖像的視覺底部,第0列是視覺右側。
4 - 第0行 位於圖像的視覺底部,第0列是視覺左側。
5 - 第0行是圖像的視覺左側,並且第0列是視覺頂部。
6 - 第0行是圖像的右側 ,第0列是視覺頂部。
7 - 第0行 行是圖像的右側,第0行是 可視底部。
8 - 第0行是圖像的視覺左側, ,第0列是視覺底部。
這裏是檢索的功能的PropertyItem
:
PropertyItem getPropertyItemByID(Image img, int Id)
{
return img.PropertyItems.Select(x => x).FirstOrDefault(x => x.Id == Id);
}
下面是使用GDI + RotateFlip
方法來調整上飛的圖像的一個例子:
void Rotate(Bitmap bmp)
{
PropertyItem pi = bmp.PropertyItems.Select(x => x)
.FirstOrDefault(x => x.Id == 0x0112);
if (pi == null) return;
byte o = pi.Value[0];
if (o==2) bmp.RotateFlip(RotateFlipType.RotateNoneFlipX);
if (o==3) bmp.RotateFlip(RotateFlipType.RotateNoneFlipXY);
if (o==4) bmp.RotateFlip(RotateFlipType.RotateNoneFlipY);
if (o==5) bmp.RotateFlip(RotateFlipType.Rotate90FlipX);
if (o==6) bmp.RotateFlip(RotateFlipType.Rotate90FlipNone);
if (o==7) bmp.RotateFlip(RotateFlipType.Rotate90FlipY);
if (o==8) bmp.RotateFlip(RotateFlipType.Rotate90FlipXY);
}
它返回旋轉版本..
我已經測試的值爲this nice set of sample images。
注意:代碼只有在圖像實際上包含方向標籤時才起作用。如果他們沒有,也許是因爲他們是掃描,那麼它會做沒有什麼。
注2您寫了我檢查了原始圖像的旋轉。這並非如此簡單:資源管理器將顯示已經旋轉的圖像,所以在這裏他們都看起來不錯,甚至檢查屬性不會顯示方向!
通常情況下,當沒有EXIF數據都存在,PropertyTagOrientation
標籤是存在,但只有擁有1
默認值..
更新: 如果圖像不有PropertyTagOrientation
這裏是你如何可以添加一個:
using System.Runtime.Serialization;
..
pi = (PropertyItem)FormatterServices
.GetUninitializedObject(typeof(PropertyItem));
pi.Id = 0x0112; // orientation
pi.Len = 2;
pi.Type = 3;
pi.Value = new byte[2] { 1, 0 };
pi.Value[0] = yourOrientationByte;
yourImage.SetPropertyItem(pi);
榮譽對@ ne1410s的優秀answer here!。
請注意,將PropertyItems
添加到圖像不會添加exif數據;這兩個是不同的標籤集!
來源
2017-03-23 10:10:24
TaW
您的意思是上傳的圖像(例如從原始的旋轉位置旋轉90度)旋轉時的一些圖片(不更改原始圖像旋轉)? –
@ P.Pat是的,有時甚至180° –