If图片包含 the 应包括方向 tag.
它对正确显示图像所需的旋转/翻转进行编码:
属性标签方向
按行和列查看图像方向。
标签 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 列是视觉底部。
这是一个检索 a 的函数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);
}
它将图像更改为正确旋转的版本。
我已经测试了价值观这组漂亮的样本图像 http://www.galloway.me.uk/2012/01/uiimageorientation-exif-orientation-sample-images/.
Note:该代码仅在图像实际包含方向标签时才有效。如果没有,也许因为它们是扫描,那么就可以了nothing.
Note 2你写了我检查了原始图像旋转。这并不那么简单:资源管理器将显示已经旋转的图像,因此它们在这里看起来都是正确的,甚至检查属性也不会显示方向!
通常,当不存在 exif 数据时,PropertyTagOrientation
tag is存在但只有默认值1
..
Update:如果图像doesn't有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 的出色表现在这里回答! https://stackoverflow.com/questions/18820525/how-to-get-and-set-propertyitems-for-an-image/25162782#25162782.
请注意添加PropertyItems
不向图像添加 exif 数据;这两个是不同的标签集!