图像旋转但缩略图不是

时间:2016-08-17 08:31:37

标签: c# image-processing exif

我正在尝试根据EXIF标签旋转图像。我能够成功处理图像的旋转,但Windows资源管理器中的缩略图仍然是颠倒的。打开时的图像绝对没问题。已验证更正的方向here.以下代码的问题在于EXIF数据似乎没有任何有关缩略图方向的信息。我想要的是:

  1. 如果有可用的缩略图方向,请旋转缩略图并更新图像的元数据以进行缩略图方向。

  2. 如果没有可用的缩略图方向信息,请旋转缩略图并添加图像的元数据以进行缩略图方向。

  3. 我使用的代码是:

    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;
    }
    

1 个答案:

答案 0 :(得分:0)

是一个老问题,但经过一些研究,我注意到即使在删除图像的方向(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);
    }