C# 图像已旋转,但缩略图未旋转
我正在尝试根据EXIF标记旋转图像。我能够成功地处理图像的旋转,但windows资源管理器中的缩略图仍然是颠倒的。打开时的图像是绝对好的。验证了更正的方向以下代码的问题是EXIF数据似乎没有任何关于缩略图方向的信息。我想要的是:C# 图像已旋转,但缩略图未旋转,c#,image-processing,exif,C#,Image Processing,Exif,我正在尝试根据EXIF标记旋转图像。我能够成功地处理图像的旋转,但windows资源管理器中的缩略图仍然是颠倒的。打开时的图像是绝对好的。验证了更正的方向以下代码的问题是EXIF数据似乎没有任何关于缩略图方向的信息。我想要的是: 如果有可用的缩略图方向,请旋转缩略图并更新图像的元数据以获得缩略图方向 如果没有可用的缩略图方向信息,请旋转缩略图并为缩略图方向添加图像元数据 我使用的代码是: public static RotateFlipType RotateImageByExifOrientat
public static RotateFlipType RotateImageByExifOrientationData(Image img, string oldFileName, string sourceFilePath, out string newFileName)
{
int orientationId = 0x0112;//Image orientation
int thumbnailOrientationId = 0x5029;//Thumbnail orientation
var fType = RotateFlipType.RotateNoneFlipNone;
if (img.PropertyIdList.Contains(orientationId))
{
var pItem = img.GetPropertyItem(orientationId);
//Get the orientation
fType = GetRotateFlipTypeByExifOrientationData(pItem.Value[0]);
if (fType != RotateFlipType.RotateNoneFlipNone)
{
img.RotateFlip(fType);
// Read orientation tag. Update to normal so that the other clients(image viewer or browser) will not rotate the rotated image.
// Force value to 1
pItem.Value = BitConverter.GetBytes((short)1);
img.SetPropertyItem(pItem);
PropertyItem thumbnailItem;
if (img.PropertyIdList.Contains(thumbnailOrientationId))
{
//If thumbnail metadata is available, update it.
thumbnailItem = img.GetPropertyItem(thumbnailOrientationId);
thumbnailItem.Value = BitConverter.GetBytes((short)1);
img.SetPropertyItem(thumbnailItem);
}
else
{
//If thumbnail metadata is not available, add appropriate metadata.
thumbnailItem = img.PropertyItems[0];
thumbnailItem.Id = thumbnailOrientationId;
thumbnailItem.Type = 2;
thumbnailItem.Value = BitConverter.GetBytes((short)1);
thumbnailItem.Len = thumbnailItem.Value.Length;
img.SetPropertyItem(thumbnailItem);
}
newFileName = "Rotated_" + oldFileName;
string targetFilePath = sourceFilePath + newFileName ;
ImageFormat targetFormat = ImageFormat.Jpeg;
img.Save(targetFilePath, targetFormat);
File.Delete(sourceFilePath + oldFileName);//Delete old file.
}
}
return fType;
}
这是一个老问题,但经过一些研究后,我注意到,即使在删除图像的方向(0x0112)和缩略图的方向(0x5029)后,当尝试再次生成缩略图时,仍然保持相同的方向。所以我检查了一些JPG是否有以字节为单位的“嵌入”缩略图。因此,在删除字节(0x501B)后,我能够正确生成缩略图 简单代码显示:
var rotateImage = Image.FromStream(fileStream);
switch (degree)
{
case eRotateImagem.Degree_90:
rotateImage.RotateFlip(RotateFlipType.Rotate90FlipNone);
break;
case eRotateImagem.Degree_180:
rotateImage.RotateFlip(RotateFlipType.Rotate180FlipNone);
break;
case eRotateImagem.Degree_270:
rotateImage.RotateFlip(RotateFlipType.Rotate270FlipNone);
break;
}
int orientationId = 0x0112; //Image orientation
int thumbnailOrientationId = 0x5029; //Thumbnail orientation
int thumbnailBytes = 0x501B; //Thumbnail bytes
if (rotateImage.PropertyIdList.Contains(orientationId))
{
rotateImage.RemovePropertyItem(orientationId);
}
if (rotateImage.PropertyIdList.Contains(thumbnailOrientationId))
{
rotateImage.RemovePropertyItem(thumbnailOrientationId);
}
if (rotateImage.PropertyIdList.Contains(thumbnailBytes))
{
rotateImage.RemovePropertyItem(thumbnailBytes);
}
我深深的怀疑是缩略图并不跟随EXIF标记,所以在更改EXIF元数据之后,您必须重新生成缩略图。