Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 图像已旋转,但缩略图未旋转_C#_Image Processing_Exif - Fatal编程技术网

C# 图像已旋转,但缩略图未旋转

C# 图像已旋转,但缩略图未旋转,c#,image-processing,exif,C#,Image Processing,Exif,我正在尝试根据EXIF标记旋转图像。我能够成功地处理图像的旋转,但windows资源管理器中的缩略图仍然是颠倒的。打开时的图像是绝对好的。验证了更正的方向以下代码的问题是EXIF数据似乎没有任何关于缩略图方向的信息。我想要的是: 如果有可用的缩略图方向,请旋转缩略图并更新图像的元数据以获得缩略图方向 如果没有可用的缩略图方向信息,请旋转缩略图并为缩略图方向添加图像元数据 我使用的代码是: public static RotateFlipType RotateImageByExifOrientat

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

  • 如果有可用的缩略图方向,请旋转缩略图并更新图像的元数据以获得缩略图方向

  • 如果没有可用的缩略图方向信息,请旋转缩略图并为缩略图方向添加图像元数据

  • 我使用的代码是:

    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元数据之后,您必须重新生成缩略图。