var exif = new EXIFextractor(ref bmp, "n")
使用库来实现功能可以节省大量时间.或者,当图书馆设计不当或难以使用时,您会陷入困境. ref bmp
是第一个响亮的警报,你试图将值指定为字符串,从而使它成为绝望的陷阱.这很有吸引力,因为您不必考虑正确的setTag()重载中"类型"可能意味着什么.它是类型3,需要一个带有两个元素的byte [].这根本不可发现,只有在不需要时才能正确使用库.
放弃图书馆,没有用.存储方向的EXIF标记的ID为0x112,并编码为16位值.只需直接使用System.Drawing读取值并强制它回到1.像这样:
static void FixImageOrientation(Image srce) { const int ExifOrientationId = 0x112; // Read orientation tag if (!srce.PropertyIdList.Contains(ExifOrientationId)) return; var prop = srce.GetPropertyItem(ExifOrientationId); var orient = BitConverter.ToInt16(prop.Value, 0); // Force value to 1 prop.Value = BitConverter.GetBytes((short)1); srce.SetPropertyItem(prop); // Rotate/flip image according toswitch (orient) { // etc... } }