我正在使用System.Drawing.Image加载JPG图片。
我发现的图像的EXIF方向标记(0x0112)类型= 9,len = 4
通常当我加载图像时,我得到Type = 3(uint16的数组,len = 2(字节))。一个线索是当我通过EXIFTool(http://www.sno.phy.queensu.ca/~phil/exiftool/)运行它时,我注意到Exif Byte Order是Little-endian(Intel,II)。所以,我有点认为System.Drawing.Image中的EXIF处理不支持这个字节顺序,或者我需要以某种方式转换来自Little Endian的字节 - > Big Endian?尽管如此,字节数并不正确。我正确解析的其他一些图像是Big Endian(虽然还没有检查过它们)。
在PropertyItem.Type的文档中,没有列出9: https://msdn.microsoft.com/en-us/library/system.drawing.imaging.propertyitem.type(v=vs.110).aspx
相关代码段:
public static Image RemoveImageOrientation(this Image imageIn)
{
if(imageIn.HasOrientationExifTag())
{
var orientationPropItem = imageIn.GetPropertyItem((int)ImagePropertyItemMetaData.PropertyTagOrientation);
if(orientationPropItem.Type != 3 // array of uint16
|| orientationPropItem.Len != 2) // only one 1 uint (2 bytes)
{
throw new ArgumentException("Unable to parse orientation EXIF tag. Type = " + orientationPropItem.Type + ", len = " + orientationPropItem.Len);
}
var orientationExifTag = BitConverter.ToUInt16(orientationPropItem.Value, 0);